Technique-tagged cold-outreach generator backed by a pre-registered Bayesian meta-analysis of named persuasion techniques.
Built by Marion Moranetz as part of an AE job search. The tool generates per-company outreach materials AND logs every send into the dataset for an in-flight 100-outreach experiment.
This repo is two things at once:
- A working CLI — generates emails, resume bullets, and GTM teardown stubs tailored to each target company
- A portfolio artifact — proof that the candidate builds sales tooling, not just talks about it
The Atlas posteriors in data/techniques.json are sourced from results/pilot_posterior_summaries.csv in the Closing Evidence Atlas v0.5 draft. Test suite enforces canonical-posterior parity so the numbers can't drift silently.
For any target company, in ~90 seconds:
outreach-lab all modal-labsproduces:
outputs/modal-labs/
├── brief.md # one-page company brief
├── emails.md # 5 cold-email variants, each using a different Atlas technique
├── resume-tailor.md # which bullets to lead with for this company, what to cut
└── teardown.md # 1500-word GTM teardown stub (verification-required)
Each email cites the exact posterior effect size of the technique it uses, from the Closing Evidence Atlas — a pre-registered Bayesian random-effects meta-analysis of named persuasion techniques (44 records extracted, 6 per-technique posteriors at v0.5 draft).
## Variant 1 — gain-framing
**Posterior:** d=0.354 [95% CrI 0.280–0.429], k=9 studies, P(d>0)=1.00
**Why this technique here:** Lowest-risk first-touch variant. Gain framing has the
cleanest posterior in the Atlas — high confidence the effect is real.
**Subject:** Built sales tooling for my Modal application
Hi <name>,
I'm applying for the AE seat at Modal. To make sure the work matches the words, I
built outreach-lab — a CLI that generates technique-tagged cold outreach + per-company
resume tailoring, citing posteriors from a Bayesian meta-analysis I ran called the
Closing Evidence Atlas.
The five variants of this email were generated by it. This one was picked because
gain-framed openers have the cleanest posterior in the Atlas (d=0.354, k=9 studies,
95% CrI excludes zero) when the recipient is already hiring.
15 minutes next week?
— Marion (SF · github.com/Moranetz)See examples/modal-labs/ for the full output set.
A standard AE job search produces a single resume sent to fifty companies and a single cold email rewritten by hand each time. Both are leaky.
This tool inverts both:
- Per-target tailoring is mechanical, not manual. The candidate's master bullets live in
data/master_resume.yaml, each tagged with the company categories it's relevant to. - Outreach is technique-tagged, not vibes-based. Five variants per target, each tagged with a technique from the Atlas + the technique's exact posterior. Sends get logged. After 100 sends, the candidate has a real dataset on which techniques moved which buyers.
The dataset is the 100-outreach experiment. The repo is the cover letter.
This tool is explicitly designed to refuse to invent specifics. Hiring managers can spot a fabricated claim about their own company in two seconds. One caught fabrication kills the credibility of the entire portfolio.
Concretely:
- The compose/tailor/teardown prompts include hard rules against inventing dollar amounts, customer names, pricing tiers, recent launches, or competitor positioning.
- When a specific is needed and not provided in the target config, the output uses an angle-bracket placeholder like
<verify before sending>. - The teardown command produces a stub with a verification checklist, not a finished essay.
- The test suite enforces that the technique posteriors in
data/techniques.jsonmatch the canonical Atlas output exactly.
The examples/modal-labs/teardown.md is intentionally written as a verification-required stub — every claim that needs a primary source is marked.
git clone https://github.com/Moranetz/outreach-lab.git
cd outreach-lab
python -m venv .venv && source .venv/bin/activate
pip install -e .
export ANTHROPIC_API_KEY=sk-ant-...outreach-lab init modal-labs \
--company "Modal Labs" \
--url https://modal.com \
--category ai-infraThis creates targets/modal-labs.yaml with <verify> placeholders. Fill them in with sourced specifics (their pricing page, careers page, customer interviews) before generating outputs.
outreach-lab brief modal-labs # 400-word company brief
outreach-lab compose modal-labs # 5 technique-tagged emails
outreach-lab tailor modal-labs # per-company resume patch
outreach-lab teardown modal-labs # 1500-word GTM teardown stub
outreach-lab all modal-labs # all four in one shotPick the best variant. Send manually (no auto-send — at the deal sizes Marion is targeting, every send is a deliberate act). Log it:
outreach-lab track modal-labs \
--variant v1 \
--technique gain-framing \
--subject "Built sales tooling for my Modal application" \
--recipient "VP Sales" \
--response openedThe track command validates the technique-id against the Atlas catalog — typos are rejected, protecting the dataset.
outreach-lab analyze Outreach cohort — 47 sends
┏━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┓
┃ Technique ┃ Sent ┃ Opened ┃ Replied ┃ Meetings ┃ Open % ┃ Reply % ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━┩
│ loss-framing │ 12 │ 8 │ 3 │ 2 │ 67% │ 25% │
│ commitment-consistency │ 11 │ 7 │ 4 │ 2 │ 64% │ 36% │
│ gain-framing │ 9 │ 5 │ 2 │ 1 │ 56% │ 22% │
│ social-proof │ 8 │ 3 │ 1 │ 0 │ 38% │ 13% │
│ regulatory-fit │ 7 │ 4 │ 2 │ 1 │ 57% │ 29% │
└────────────────────────┴──────┴────────┴─────────┴──────────┴────────┴─────────┘
That table — built up from real sends — is the dataset that an AE hire promises. Most candidates promise the dataset. This candidate ships it.
A static HTML dashboard at dashboard/index.html visualizes the
cohort response-rate table for public consumption — summary stats, per-technique
funnel, open-rate bar chart, and the Atlas posteriors as reference. Hosted via
GitHub Pages at https://Moranetz.github.io/outreach-lab/ (after enabling Pages
in repo settings; folder: /dashboard).
Drop your real outreach_log.csv in place of dashboard/sample_log.csv and
the table updates live.
outreach-lab techniques
outreach-lab techniques --cluster framingLists all 39 techniques in the Atlas catalog across four populations:
- With current posteriors (6): gain-framing, loss-framing, regulatory-fit, extreme-anchor, social-proof, commitment-consistency
- Inclusion literature, posterior pending (8): FITD, DITF, concrete-construal, lowball, authority, reciprocity, scarcity, disrupt-then-reframe
- Fragile, <5 studies (10): range-anchor, affect-labeling, liking, etc.
- Empirical deserts (15): The Atlas's most counterintuitive finding — 15 named closing techniques widely taught in modern sales programs have ZERO peer-reviewed empirical studies meeting inclusion criteria. Including Ben Franklin close, assumptive close, summary close, trial close, mirroring, accusation audit, bracketing, multi-threading, SPIN implication, SPIN need-payoff.
outreach_lab/
├── cli.py # Click entrypoint
├── atlas.py # Loads techniques + posteriors from Closing Evidence Atlas
├── brief.py # Brief generator
├── compose.py # 5-variant email generator (anti-fabrication-hardened prompt)
├── tailor.py # Per-company resume bullet patch
├── teardown.py # 1500-word GTM teardown stub
├── track.py # CSV logging + cohort analysis + technique-id validation
├── targets.py # Loads per-company YAML configs
└── llm.py # Anthropic Claude API wrapper (Sonnet 4.6 + Opus 4.7)
data/
├── techniques.json # Full 39-technique catalog with real posteriors
└── master_resume.yaml # Candidate's master bullet library, tagged by category
targets/ # One YAML per target company. Committed.
├── example.yaml
├── together-ai.yaml
└── vapi.yaml
examples/ # Curated demo output per target. Committed.
└── modal-labs/ # Fully populated demo
outputs/ # User's generated artifacts. Gitignored.
outreach_log.csv # User's outreach dataset. Gitignored.
tests/ # 23 tests covering Atlas parity, validation, CLI
├── test_atlas.py
├── test_cli.py
├── test_targets.py
└── test_track.py
pytest -v23 tests, ~0.3s. Covers:
- Atlas posterior values match the canonical Atlas output exactly (drift would silently corrupt all generated emails — the test prevents that)
- No fabricated techniques sneak into
techniques.json - Full 39-technique catalog is present
- The 15 empirical-desert techniques are correctly classified
trackcommand validates technique-ids — typos rejected- CLI subcommands resolve and error appropriately
Lint: ruff check outreach_lab tests — clean.
CI: GitHub Actions runs the test suite + ruff on Python 3.10, 3.11, 3.12, 3.13.
- Not an email blaster. Manual send only. No SMTP integration. No LinkedIn automation. No scraping.
- Not a CRM. It's a generation + logging tool. Real CRM lives in the candidate's head.
- Not a personality test. Five variants per target gives the recipient five chances at a hook, not five attempts at the same hook.
MIT. Forking encouraged. If you ship a variant of this for your own AE search, ping @Moranetz.
- closing-evidence-atlas — the meta-analysis this tool draws posteriors from
- selected-work — Marion's curated portfolio
- moranetz.github.io — the front door