Autonomous research → evidence → outreach · human approves every send

Outreach that proves
it did the reading.

Most cold email is a template with a name swapped in. This system reads the company's own words, finds the workflow that's costing them time, picks the person who owns it, and writes the message from evidence — with every sentence tagged fact, inference or hypothesis. Nothing sends until a human clicks approve.

0real postings assessed in one afternoon
0rejected — each with a quote proving why
0real hiring addresses found, sourced & labelled
$0.33research spend for all of it
research run · live step log

    
Real log lines from a real run. The system narrates every step and says “not a fit” out loud when the evidence isn't there.
01 · Personalisation you can audit

The posting said X. So the system wrote X.

Not “I see you're growing.” It quotes the company's own words back — the product name, the team, the exact responsibility — and only claims what it can point to. Below: what the source actually said, and the opening line the system produced. All real.

their site said

Skoll · “Connect CRM, enrichment, outreach and analytics… agents Midas, Athena, Argus, Icarus, Hermes”

→
the system wrote

“Skoll's idea of connecting CRM, enrichment, outreach, and analytics into one system is exactly the kind of orchestration problem I've been building for. The part that stood out most is the agent layer with Midas, Athena, Argus, Icarus, and Hermes doing real work across the GTM stack.”

Launchyfi · Founding Lead AI Engineer · fit 95 · subject: Built the GTM agent core you described
their site said

Huzzle · “Heidi runs the recruiting workflow autonomously — sourcing, screening, interviews, scheduling”

→
the system wrote

“Huzzle's Heidi is doing the full recruiting loop autonomously, so the hard part is less the model and more reliable screening, matching, and evaluation at scale. That's the kind of system I've been building end to end.”

Huzzle · Remote AI Engineer · fit 96 · recipient: founder's published address
the posting said

Kobie · “internal agent platform on AgentCore to automate analyst workflows and surface insights from Snowflake data”

→
the system wrote

“I took a close look at how you're building an internal agent platform on AgentCore to automate analyst workflows and surface insights from Snowflake data. That mix of tool calling, retrieval, and production reliability is exactly the kind of problem I've been shipping on.”

Kobie Marketing · AI Engineer · fit 88
the job posting said

Pylon · Customer Success Operations: “build the foundation for company-wide reporting and insights”, “monitor product usage and customer signals”, “create dashboards”

→
the system wrote (sales mode)

“I noticed Pylon has at least 5 open roles, including Scaled Customer Success Manager and Customer Success Operations, and the Customer Success Operations role puts build the foundation for company-wide reporting and insights, monitor product usage and customer signals and create dashboards on the team.”

Pylon · opportunity: recurring report preparation · buyer: COO (verified address) · evaluator 10/10 · hallucination risk: low
their site said

3Pillar Global · “HelixAI, governed agentic workflows, Bedrock integration for Canopy and Trellis… context-aware prompts, audit-trail logging”

→
the system wrote

“3Pillar's focus on HelixAI, governed agentic workflows, and the Bedrock integration for Canopy and Trellis stood out to me, especially the part about context-aware prompts plus audit-trail logging. That's the same hard edge I like solving: making LLM systems useful, traceable, and cheap enough to run in production.”

3Pillar Global · AI Lead Engineer · fit 88
Every sentence is classified before it can be sent
FACT I noticed Pylon has at least 5 open roles including Scaled Customer Success Manager… → traceable to 2 posting URLs
INFERENCE That suggests a meaningful part of the team's week goes to moving information between Catalyst, Zendesk and Slack… → hedged, tools taken from the postings
HYPOTHESIS I suspect much of the pull data → clean → build report → distribute loop could run automatically… → hedged, never stated as fact
A quoted phrase that isn't in the source fails the draft. A number without a signal behind it fails the draft. Buzzwords fail the draft. The evaluator caught a bad quote in a live run and rejected the email — that's the point.
02 · The pipeline

Eleven steps. Structured data between every one. A human at the gate.

Not one giant prompt. Separate agents exchange typed records — signals with source URLs, hypotheses with facts vs inferences, scores with per-dimension reasons — so every output can be traced back to what was actually observed. Click a step.

Discover

Companies matching an ICP (industry, size, geography, growth signals) from a pluggable search provider — deduplicated by domain, filtered off aggregators, sized against the profile.

[OK] discovery: 6 candidate(s) from provider 'exa'
[OK] dedupe: removed 1 duplicate result(s) by domain

Research

Homepage + careers subpages, individual job postings across boards, recent news. Marketing pages are never mined for “operational pain” — only hiring pages, because marketing copy describes the product, not the team's own manual work.

company:usepylon.com — 14 signals, 3 hypothesis(es)
sources: usepylon.com · builtin.com/job/customer-success-operations · jobs.ashbyhq.com/pylon-labs

Extract signals

Phrase families (not exact strings) catch “maintain accurate records in Salesforce”, “compile weekly closing status reports”, “follow up with carriers on missing paperwork”. Each signal stores the exact company language, source URL, date, confidence, and why it matters. Engineering roles are excluded — an engineer's “maintain data pipelines” is not repetitive ops.

{ "signal_type": "workflow", "workflow_category": "reporting",
  "company_language": ["build the foundation for company-wide reporting and insights", "create dashboards"],
  "source_url": "https://builtin.com/job/customer-success-operations/7909543", "confidence": "high" }

Hypothesise the workflow

1–3 opportunities per company, each with facts (observed, with signal ids), inferences (believed), and the hypothesis (what could be automated) kept strictly apart. Weak evidence produces “not a fit — insufficient evidence”, not a stretched story.

likely_workflow: pull data from systems → clean/combine → build report → distribute → answer follow-ups
automation_potential: high · buyers: COO, VP Operations, Head of Operations, CFO

Score 0–100

Pain intensity /20 · repetition /15 · labour savings /15 · automatability /15 · financial value /15 · evidence strength /10 · fit /5 · buyer access /5 — every dimension stores its reason. Conflicting sources cost evidence points. No fabricated dollar figures: value is qualitative and says so.

Pylon: 73/100 — pain 12 · repetition 9 · labour 8 · automatability 14 · value 11 · evidence 8 · fit 5 · buyer 5

Pick the buyer

Not the CEO by default. A configurable ranking per workflow (JSON, no code): sales research → CRO / VP Sales / Sales Ops / COO; support → VP CS / Head of Support; finance → CFO / Controller. If the top person has no reachable address, the next-ranked one is tried and the reason is recorded.

chosen: Head of Revenue Operations — matches 'revenue operations' priority for CRM data maintenance
(chosen after no email could be confirmed for: Sales Operations)

Verify the contact

Five honest states: verified · likely_valid · risky · invalid · unknown. “Verified” only when the mail server accepted the mailbox and the domain isn't catch-all. Pattern-inferred addresses are labelled as such and never dressed up as verified.

contact discovery: verified (jesse@…) — 2 candidate(s) checked via mailsso
contact discovery: unknown — 4 pattern(s) rejected by the mail server

Draft from evidence

First a personalisation brief (observed fact, signal, their exact wording, likely pain, hypothesis, buyer reason, sources). Then the email — hook in their language, one hedged inference, one hedged hypothesis, low-friction ask. No exclamation marks, no “revolutionise”, no fake familiarity.

subject: recurring reporting at Pylon
hook: I noticed Pylon has at least 5 open roles… puts "build the foundation for company-wide reporting and insights" on the team.

Evaluate

A separate agent scores specificity, evidence accuracy, personalisation, naturalness, relevance, clarity, value proposition, CTA, spam risk, hallucination risk. Below threshold → rejected before a human ever sees it.

evaluation: avg 10.0 · passed · spam low · hallucination low
(rejected in a live run: "Quoted phrase(s) not found in any collected source")

Human approves

The review screen shows company, person, why them, evidence, hypothesis, score, email, evaluation, sources — then Approve / Edit / Regenerate / Reject / Save. Sending is blocked server-side unless the message is approved and the address isn't invalid. Default sender writes to a local outbox; real SMTP is opt-in.

POST /outreach/{id}/send → 409 "Only explicitly approved messages can be sent"

Send & track

Timestamp, recipient, subject, provider, lead id — and a follow-up state machine (drafted → approved → sent → replied → meeting / not interested / bounced / no response) that suggests follow-ups to the human rather than firing them.

communication_events: sent · status_change: replied → meeting
03 · The part most automation skips

It knows when to say no — and it shows its work.

An AI that convinces itself every company is a good lead is worthless. In the job-seeker run below, 99 of 169 postings were rejected — each with the exact sentence from the posting that disqualified it. Same discipline on the sales side: weak evidence → “not a fit”, with the reason stored.

not eligible only when the posting says so, in its own words
eligible only when the posting explicitly allows it
unclear when it doesn't say — never assumed either way
04 · Receipts

The parts we refused to “vibe” through.

Every one of these was a real failure found by inspecting real output — and each one is now a guard in the code, not a note in a doc. This is what separates a demo from something you'd let near your customers.

A short company name resolved to the wrong company — “Teak” became a furniture store, “Loka” an Indian firm.
Every resolved domain's homepage is checked against the posting; wrong ones are dropped and the draft deleted.
Email patterns were “learned” from placeholders — jane.doe@, First.Last@, even secure@. Some bounced.
Placeholders and generic mailboxes can never be pattern evidence; “first-name” patterns only from a real named person. Bounces recorded; addresses tiered published / inferred / generic.
Marketing copy got read as operational pain — a product page saying “follow-up emails” became a “manual follow-up” signal.
Workflow language counts only on hiring pages. Engineering postings excluded (customer-facing “engineer” titles kept).
The LLM invented a workflow category (“marketing intelligence / attribution”) and quoted a job-board timestamp as a requirement.
Known categories only; quotes must exist verbatim in the source; dates, titles, links and “Published:” filtered before they can be quoted.
Two emails to the same person for two opportunities.
One draft per person per run — best-scoring opportunity wins, the rest are noted.
Gmail hard-wrapped plain-text drafts at 72 chars, cutting sentences mid-line.
Drafts are created as HTML + text alternatives; real paragraphs, clickable links.
Job-board boilerplate “Open to applicants worldwide” contradicted the role text (“on-site, Serbia”).
Boilerplate is not the employer's policy; conflicting mirrors are downgraded to “unclear” and say so.
The verification provider ran out of credit; everything read “unknown”.
Provider errors are surfaced verbatim in the run log — never silently as “could not be checked”.
05 · The product

Plain screens. Everything clickable does something.

Real screenshots of the running system. Personal names and addresses are masked; companies and public posting quotes are real.

Dashboard with pipeline strip and counters
Dashboard. The pipeline as a strip; live counts of researched, high-opportunity, awaiting approval, sent, replies, meetings — and how many it refused.
Prospects table
Prospects. Company · opportunity · score · buyer · the top signal in the company's own words · status.
Review queue
Review queue. Drafts waiting for a human, with the recipient's verification status and the evaluator's score.
Outreach message view with personalisation brief and claim classification
The message view. Email on the left; the personalisation brief, FACT/INFERENCE/HYPOTHESIS classification and sources on the right; Approve / Edit / Regenerate / Reject / Send below.
Job search results with eligibility quotes
Job-seeker mode. Fit score, eligibility quoted from the posting, salary, contact status, one-click to the draft.
Application view with fit reasons, gaps and how to apply
Application view. How to apply, why it fits, the gaps to prepare for, verbatim requirements, eligibility evidence, and the draft.
Activity log with step-by-step run trace
Activity. Every run, every step, every warning — a failed run tells you exactly where it failed.
06 · Two directions, one engine

Sell with it. Or get hired with it.

You bring an ICP. It brings qualified conversations.

  • Discovers companies, reads their hiring pages and news, and finds the repetitive workflow hiding in plain sight — “reconcile carrier invoices”, “compile weekly closing status reports”, “enter data from claim forms into Applied Epic”.
  • Turns it into a scored opportunity with a named buyer and a verified contact, and drafts the note in their words.
  • You approve, edit or reject in one screen. The optimisation target is qualified conversations per hour of founder effort, not emails sent.

Live example: 6 real B2B SaaS companies → 2 drafts to verified addresses, 4 honestly marked “not a fit”, ≈ $0.14 of research spend, 15 s per company.

You upload a resume and say what you want. It does the hunt.

  • Parses the resume (nothing invented — achievements are checked against the PDF text), builds search angles, finds live postings, dedupes mirrors.
  • Scores fit, lists the gaps, and decides eligibility only from what the posting says — “Must be US-based.” is a no; “work from anywhere in the world” is a yes; silence is “unclear”.
  • Finds a real address (posted, published, or pattern-inferred and labelled as such), tailors the resume by re-emphasis only, writes the email in your voice from their site, and puts it in your Gmail Drafts with the PDF attached. You hit send.

Live example: 169 postings assessed → 99 rejected with quotes → 67 drafts → 44 with real recipients (16 published, the rest labelled inferred/generic).

07 · Under the hood

Boring where it should be. Careful where it matters.

Deterministic core, LLM as refinement. Evidence assembly is code (phrase families, scoring, composition from quoted language). The LLM can only add what verifies verbatim against a source, and polish prose without dropping a quote — otherwise its output is discarded.
Provider-agnostic. Discovery, LLM, verification and email sit behind interfaces: Exa · OpenAI or Anthropic · mails.so · Gmail SMTP — swap any by changing one env var. Offline fixture mode runs the whole pipeline with no keys.
Traceable by construction. email claim → signal ids → signal.source_url → research_sources → research_run. PostgreSQL, 19 tables, every step of every run logged.
Tested. 52 automated tests including the ten required scenarios: rich data, thin data, many-jobs-no-pain, strong signals, no confident buyer, no verified email, duplicate company, unreachable website, conflicting sources, and “do not pursue”.
Honest failure. Unreachable site → partial, not fabricated. No buyer → opportunity shown, no draft. Invalid email → send blocked. Provider down → error in the log, verbatim.
Stack. Python · FastAPI · SQLAlchemy · PostgreSQL · vanilla JS · Playwright for evidence screenshots. Built end to end, solo, in about three days.
Work with me

Bring me a repetitive workflow. I'll show you the automated version on your data before you pay.

Lead research, sales ops, support triage, recruiting coordination, reporting, invoice reconciliation, back-office chasing — if people move information between systems by hand, it can probably be operated by an agent with a human at the gate. The pipeline above is the proof of how I work: evidence first, no vibing.

Engineers: the codebase, architecture doc and test suite are available on request — happy to walk through any of it.