← back to writing
Engineering deep dive

Verum: an outreach agent that's only allowed to send what it can prove

Landing page ↗

Most "AI outreach" tools are email generators wearing a sales pitch: give them a company name, they invent a personalized-sounding paragraph, you send it and hope. Verum is what I built instead — an agent that researches from primary sources and is structurally incapable of sending unless every claim traces to a source URL and every gate passes. If it can't prove something, it doesn't get to say it.

Not a generator. An operator.

A generator stops at "write me a cold email." An operator owns the whole loop: find the company, verify the gap, find the right person, write, track, follow up once, escalate a reply, know when to stop. The email is the easy 10%.

Ranuvo, my own company, is customer zero — dogfood it, measure what I still do by hand, extract that into features, only then think product. Building the multi-tenant version before knowing a single email gets a reply is the expensive way to find out it doesn't.

The pipeline

discover → verify → research → draft → REVIEW → send → track → follow up
                                 ▲                          │
                                 └──────── escalate ─────────┘

REVIEW is a human gate — me — and it stays there permanently for anything scored low confidence, even once the rest is trusted.

Finding the right person is the hard part. The agent works out which function owns the problem — from leadership pages, filings, org structure — treating absence as a signal too: no CIO on the executive page is why the target becomes finance instead of IT. A name only counts from a source trusted enough to act on directly; a data broker is a lead, never a confirmed contact, until tier one through three backs it up.

Same rule for the route to them: a published address, fine. Guessing firstname.lastname@company.com — never. If no address can be verified, the record is marked blocked, not downgraded and sent anyway. Two of the first three worth writing to sat exactly there: verified person, no verified way to reach them, staying blocked rather than getting a guessed send.

Eleven gates, any one kills a send

Real fit, a sourced current problem, a dated reason to write now, a verified route, the right person, no pending acquisition or layoffs, never contacted before, not suppressed, no invented facts, an allowed country under that country's actual law, and high confidence on every other gate — if I had to argue for one rather than confirm it, it doesn't count as passed.

Any gate uncertain, the lead goes to REVIEW with the failing gate named — a normal outcome, not a failure. On the first batch of ten, three were disqualified once the agent found they'd already built the thing I'd have pitched them.

State lives in git, not memory

Runs are scheduled cloud jobs with no memory between them, so every run restores state from a dedicated git branch first, and every send, reply, and follow-up gets pushed back before it ends. A crash doesn't lose what happened — it's committed, not held in a process that just died.

The real safety net: the Sent folder is the source of truth on duplicates, not the state file. Before every send, the agent cross-checks Sent against what state thinks happened. If they disagree, Sent wins and nothing goes out. A crashed run can leave the state file wrong; it can't make the mailbox lie.

Replies end the agent's authority, not start it

A reply classified INTERESTED, HOT, or QUESTION gets a drafted response — and stops there, flagged for me. Only mechanical replies get handled unattended: an out-of-office pushes the date, a referral updates the contact. Anything with real judgment waits for a human.

NOT_INTERESTED is the one exception that runs instantly: straight to suppression, no waiting. An agent that keeps following up after someone says no is worse than no agent — that's the design constraint the rest of the reply logic is built around.

What it looks like from the outside

One digest a day, built from the state store rather than the mailbox:

NEEDS YOU (2)
  • Company A — draft ready, no verified contact. Blocked 3 days.
  • Company B — reply classified INTERESTED. Not auto-answered.

QUEUE
  2 CONTACT · 5 HOLD · 3 SKIP

Decisions come first, on purpose — readable on a phone in fifteen seconds. The landing page is the only public part. Prospect research, contact records, the mailbox, and the send log all stay in a private repo.