Projects › Account Research

Watch the demo (AI-narrated, 1:32)

Narrated with a generated voice; captions included.

Recorded on the live app with a saved example brief (no live run): Club Med's brief with numbered sources and quotes checked on their pages, the meeting questions, use-case guesses and email, a question answered only from the findings, and the limits on live briefs.

Read the narration

Before a first client meeting, I spend a couple of hours reading about the company.

This does the gathering for me,

and every line it writes has a source.

It's a simulated engagement, and it only reads public web pages.

Here's a saved brief for Club Med.

A planner wrote six questions, researchers searched the web for each,

and a critic in plain code checked the work.

Forty-one findings made it through.

Every line cites a numbered source.

For each source, it went back to the page

and checked the quote is really there:

thirty-two of thirty-seven here.

Then ten questions for the meeting,

three use-case guesses with what we don't know yet,

and a short email asking for a call.

I can ask about the brief.

What do guests complain about most?

It answers only from the findings, with their IDs.

No new searches.

A live brief costs about fourteen cents in searches,

so without a demo code there are three a day for everyone,

and all live runs stop at ten dollars a month.

In the eval, seventeen of eighteen briefs pass every check.

The weak spot is made-up companies:

on the held-out ones it stayed honest in only one of three.

That's written down, not hidden.

It's live, the link's below, and so is the code.

Try the live appMy own-voice recording will replace the generated narration.

Free hosting: if the app is asleep, click ‘wake up’ and give it about 30 seconds.

Account Research Agent

Type a hotel company's name and get a brief for a first client meeting: who they are, recent news, what guests say, tech hints, ten questions, three use-case guesses and a short email. Every line has a source, and every quote was checked on its page.

Independent project: the pre-sales stage of the same simulated hotel engagement. The agent reads real public web pages about real companies; the eval also uses fictional companies on purpose. No private individuals are researched. Every number below comes from a saved report in the repository, except the live brief's cost and time, which come from the app's own log.

Live on free hosting: three saved example briefs are free to open; live briefs need a demo code, or are limited to three a day across everyone, and all live runs stop at $10 a month.

Problem

There's a first call with a resort group on Monday. I open their website, an annual report, three news articles and a review site, and an hour later I have a page of notes, half of them without a link to where I read them. On Monday someone asks “where did you see that?” and I can't say. Or the company is small, there's almost nothing public, and the notes fill the gap with guesses.

Approach

  • Four small steps: a planner writes six questions; a researcher answers each with Anthropic's web search (at most two searches); a critic keeps only sentences web search cited; a writer builds the brief from what was kept.
  • The critic is plain code, not a model: it can't be talked into keeping a claim. It removes uncited sentences, scrubs personal data, flags news older than a year, and re-reads each cited page (robots.txt first) to find the quoted text.
  • The writer can only cite what was kept: any line that cites nothing, or a finding that doesn't exist, is dropped in code.
  • Visible and capped: every step shows its time and cost; a run stops researching near $0.25; 3 briefs per visit, 30 briefs and $3 a day.
  • Then a chat about the brief (answers only from its findings, no new searches) and a read-only share link.

Architecture

  • A company name (and optional website) in the Streamlit appThree saved example briefs open free; a live brief needs a demo code or one of three public briefs a day.
  • limits.py
    Per visit, per day, public briefs, $3 a day, $10 a month (the monthly total read from the Neon ops log, so a restart doesn't reset it).
  • Planner (Claude Haiku 5.5, JSON)Six questions: overview, properties, news, guest themes, technology, AI.
  • Researchers (Claude Haiku 5.5 + web search)One per question, at most two searches each, stopped near $0.25 a brief.
  • Critic, plain codeKeeps only cited sentences, removes personal data, flags old news, and re-reads each cited page (robots.txt first) to find the quote.
  • Topics with nothing usable: researched once more with a hint, if budget is left.
  • Writer (Claude Haiku 5.5, JSON)Builds the brief only from kept findings; lines that cite nothing are dropped in code.
  • The brief, its steps and costThen “Ask about it” (answers from the findings, no new searches) and a read-only share link.
docs/ARCHITECTURE.md

in the repository.

A real output

Club Med, “What guests say (themes)” and “How this brief was checked”

Guests praise warm, attentive service and staff who remember them, especially for children. [21][39]

Food variety and buffet quality draw repeated criticism. [22][23]

Value for money, extra costs, and room upkeep recur as concerns. [21][24]

Findings kept: 41; removed for having no source: 22; brief lines dropped for citing nothing: 0. Cited quotes found on their page: 32 of 37 checked. Cost 0.140 USD (12 web searches, 8 model calls), 108 s.

From the saved Club Med example (the 2026-10-25 dev eval run, run 1), the same brief the live app opens for free; trimmed to four lines. A live public brief for Club Med on 2026-10-28 cost $0.140 and took 112 s (the app's ops log).

Results

Eval, 3 runs per company: 4 real and 2 fictional (dev), 1 real and 1 fictional (held-out)
CheckDevHeld-out
Briefs passing every check17/184/6
Lines sourced, no personal data, email honest18/186/6
Fictional companies: nothing invented5/61/3
Cited quotes found on their page88%68%
Research sentences kept (with a source)49%44%
Time per brief, p95109 s106 s
Cost per brief$0.14$0.14

As measured, before two fixes to my own checks: dev 15/18, held-out 3/6. The weak spot is fictional companies with near-namesakes. On held-out, one brief stated a pizza pop-up with the same name as if it were the company, and another left a similarly named company's acquisition as “unconfirmed” instead of setting it aside. I reported both and haven't tuned for them. Still to measure: whether each sentence says what its source says, which needs a person; 30 sampled claims are ready to label.

What the eval taught me

Read the briefs, not just the scores. I stopped the first run after five briefs: four passed every check, but one outreach email opened “I'm a Forward Deployed Engineer” and two said “I'm Vamsi, an engineer…”, signed with my name. My title is Senior Software Engineer, and no check looked at that. The writer no longer describes the sender, and a new check fails any email that does. Reading the final run then found two bugs in my own checks: a hype-word check that fired on a cited page's title (“seamless travel experience”), and a fictional-company check that failed an honest “the closest matches are different businesses”. Both are fixed with the real phrasings as tests, and the as-measured reports are kept.

Trade-offs

Trade-offs
ChoiceWhyWhat it costs
A critic in codeCan't be talked into keeping an uncited claimCan't judge whether a sentence says what its source says: that needs a person
Anthropic's web searchCitations come attached to the textMost of the cost: about 12 searches, 12 cents a brief
robots.txt before every fetchOnly read what sites allowSome quotes can't be verified and are marked so
Researchers one after anotherSimple, and the cost cap is exactAbout 90 seconds a brief; parallel is next

Engineering

  • Tests: 46, 91% coverage (main's CI, 2026-10-28), with the model and the web replaced: the pipeline, the cost cap, the critic, the fetcher's robots.txt handling, the chat, the share link and the eval's grader.
  • CI: ruff, pytest with a coverage gate, re-scoring the saved eval runs (any changed verdict fails), pip-audit, a link check and gitleaks.

Business case (projection)

A projection from stated assumptions, not a result: for a team of 8 engineers, about $27,000 a year of prep time in the base case, from $1,200 (pessimistic) to $66,000 (optimistic). The AI cost per brief is measured; review time is the swing factor, since checking a brief can cost as much as the prep it replaced. A four-week pilot would time prep with and without it and mark each brief line used, unused or wrong.

Limitations

  • No hand labels yet: the checks prove each line has a source and each quote is on its page, not that the sentence says what the source says.
  • Fictional companies with real near-namesakes are the weak spot: on the held-out ones it stayed honest in 1 of 3 runs.
  • A quote “not found” isn't always wrong: some pages load their text with JavaScript, which the fetcher doesn't run (68% found on held-out).
  • The saved example briefs are from the 2026-10-25 eval run and aren't refreshed; the eval runs never recorded their steps, so a saved example has no Steps tab, and a caption says so (live briefs show theirs).
  • The daily limits are per app instance and reset when the app restarts; the $10 monthly cap is read from the ops log and doesn't.
  • Researchers run one after another, so a live brief takes about 90 to 110 seconds; name redaction is pattern-based.

What's next

  • Label 30 sampled claims by hand for the unsupported-claim rate
  • Run the six researchers in parallel (about 90 seconds to about 20)