Ivan Savchenko
← All demos
Scout

An AI sales rep that quotes a source for every fact and drafts cold email for your approval (sending is capture-only)

Scout researches a company, scores it against your ideal customer profile and drafts cold email. Each personal detail is a claim tied to a saved quote (or your offer), checked but not guaranteed.

11.5% → 7.6%
claims an independent model flags as unsupported, first drafts → after the claim checker
14/14 vs 9/14
hard accounts routed right: rules first (13/14 as run, 14/14 after a fix the run exposed) vs the model alone; the 14 are traps, stale and borderline cases
86.2% → 100%
recall on 29 bad claims, rules alone → rules + model verifier. Precision 100% → 90.6% (3 false alarms); 57 synthetic claims written by the AI that wrote the code
49 of 59
company segments the free model labelled right; 2 wrong labels changed the outcome
Interactive demo

Slip a false claim past the rules

A fictional company, the research Scout saved about it and one sentence of a draft email. Write a claim, tick the evidence it cites and see which rules catch it. Some false claims get through the rules, and the demo shows which.

A small browser version with a deterministic fake model — no API key, nothing leaves your device. The real project is in the repo.

What it solves

Many generic AI email tools skip the research, and when they personalize they can get facts wrong (“congrats on the Series B” to a company that never raised one), which is worse than not personalizing at all. Some also send on their own, which is how a company ends up emailing a competitor, an existing customer or someone who asked not to be contacted. That is the project’s motivation, not a measurement: the repo compares Scout with a generic template (a model judge preferred Scout’s email for 15 of 18 accounts), not with named tools.

How it works

  1. Research with receipts: a model reads the crawled pages and returns facts, buying signals and people, each with a quote. Plain code keeps a fact only if its quote is on the cited page (or re-attributes it to the page that has it) and throws it away otherwise; dates and freshness come from the page. Rules remove sentences that address AI systems before any model sees the page (tested on 2 planted injections).
  2. Rules first, model second: a rubric you control (segments, size, regions, disqualifiers, buying signals) scores the account with a reason and a source for every point. A model may nudge the score by at most ±10 points, with cited facts, and never over a disqualifier.
  3. Draft, check, ask a human: each personal sentence in the email is declared as a claim tied to evidence. Deterministic rules and a model verifier check every claim, and a failing draft is rewritten (up to 2 times by default) or trimmed. Then a person approves, edits or rejects, and sending goes only to a capture server (Mailpit).

The honest verdict

On a synthetic web of 60 fictional companies, with free models only, the structure held: all 844 quotes were on the cited page, all 59 planted buying signals were found (4 of the 63 extracted signals were not planted ones, 3 of them traps), and nothing could be sent without an approval. The companies, labels, replies and claims were written by an AI agent (Claude) in the same session that wrote the code, so the benchmark is not independent. Where the model is weak, the rules carried it: the model alone routed 9 of 14 hard accounts right; rules first got 13 of 14 as run and 14 of 14 after a fix that this run exposed, scored on the same accounts. Claims that an independent model flags as unsupported fell from 11.5% to 7.6% (6 of 79), not to zero. That was measured on 18 accounts with at most one rewrite per variant (the default is two). The checker is much stricter about the prospect than about the seller’s own offer (“tracking from day one”), though none of the remaining claims is a wrong name, number or date about the prospect. Segment labels are the weakest link: the free model got 49 of 59 right (Claude Haiku 5.5 and Qwen 3.7 Plus: 54), and 2 wrong labels changed the outcome. Its bounded judgment also twice read “CA” (Canada) as California; both accounts stayed qualified. No real website was crawled, so read the numbers as evidence that the mechanisms work, not as a forecast for your market.

PythonFastAPIPostgreSQLNext.js
Next demoSwitchboard →