Skip to content

Moranetz/outreach-lab

Repository files navigation

outreach-lab

CI License: MIT Python 3.10+

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:

  1. A working CLI — generates emails, resume bullets, and GTM teardown stubs tailored to each target company
  2. 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.


What it does

For any target company, in ~90 seconds:

outreach-lab all modal-labs

produces:

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).

Sample output — the gain-framing variant on Modal Labs

## 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.

Why this exists

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.

The anti-fabrication discipline

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.json match 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.

Install

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-...

Use

1. Initialize a target

outreach-lab init modal-labs \
  --company "Modal Labs" \
  --url https://modal.com \
  --category ai-infra

This creates targets/modal-labs.yaml with <verify> placeholders. Fill them in with sourced specifics (their pricing page, careers page, customer interviews) before generating outputs.

2. Generate

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 shot

3. Send + log

Pick 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 opened

The track command validates the technique-id against the Atlas catalog — typos are rejected, protecting the dataset.

4. Analyze

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.

Public dashboard

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.

5. Inspect the full Atlas catalog

outreach-lab techniques
outreach-lab techniques --cluster framing

Lists 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.

Architecture

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

Tests

pytest -v

23 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
  • track command 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.

What this repo is NOT

  • 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.

License

MIT. Forking encouraged. If you ship a variant of this for your own AE search, ping @Moranetz.

See also

About

Technique-tagged cold-outreach generator backed by a Bayesian meta-analysis of named persuasion techniques. Built as part of an AE job search.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors