cold-email · git:20261004.58fdc08 · 2026-10-04 · sha256 ad0853ecc70b94cf

cold-email git:20261004.58fdc08A

Immutable. This exact content never changes and is served at /api/v1/blob/ad0853ecc70b94cf.

---
name: cold-email
description: >
  Signal-anchored B2B cold email program. Writes first touches under 90
  words with a binary CTA, builds Day 3 / 7 / 14 follow-ups, picks and
  scores subject lines, lints spam triggers, checks sending-domain health
  (SPF, DKIM, DMARC, reputation, warm-up), scores and dedups an existing
  send list, triages replies, re-engages stalled prospects who have not
  opted in, and runs a 30-point outbound audit. Anchors every output on a
  Pain Signal Profile, not demographics. Use when the user says "cold
  email", "cold outreach", "follow-up sequence", "deliverability", "SPF",
  "DKIM", "DMARC", "domain health", "outbound audit", "subject line",
  "spam check", "score this reply", or "clean my send list". Not for a
  give-first offer email (use sales-offer), not for choosing who to
  contact this week (use prospect-list), and not for welcome or nurture
  sequences after someone opted in (use email-sequence).
allowed-tools: Read Write Grep Glob WebFetch
license: MIT
models: ""
---

# Cold Email — JMC Outreach Craft Skill

Comprehensive cold email orchestrator for B2B operators. Anchors every
output on a Pain Signal Profile (not demographics) and forces the output
into a shape you can ship.

## Preflight (every invocation)

Run this before routing anywhere. It is what `AGENTS.md` rules 1 and 2
require.

1. Look for `brand-config.json` and `SOUL.md` in the operator's project
   root. Read both if present.
2. If either is missing and the operator did not pass `--no-config`,
   route to `cold-email-onboarding` before drafting real outreach. Offer
   once; if they decline, say the output will be framework-shaped but
   generic.
3. If `brand-config.json` exists, sanity-check the fields the requested
   job needs (e.g. `evp.primary` for drafting, `infrastructure.sending_domain`
   for deliverability). Ask for anything missing. Never fill it in.
   If the `psp` or `evp` block is missing, say which pack produces it
   (`/plugin install psp@gtm-operator-skills`, `/plugin install evp@gtm-operator-skills`)
   instead of inventing a signal, pain, or EVP.
4. Treat SOUL.md as voice only. It can change word choice; it cannot
   lift the word limit, soften the binary CTA, or un-ban a pattern.

## Quick Reference

| Slash | What it does | Sub-skill |
|---|---|---|
| `/cold-email` | Detect state and pick the next step | `cold-email-kickoff` |
| `/cold-email status` | Program status from brand-config + logs | `cold-email-kickoff` |
| `/cold-email onboarding` | 10-minute brand-config + SOUL.md setup | `cold-email-onboarding` |
| `/cold-email write` | One signal-anchored email (<90 words, binary CTA) | `cold-email-craft` |
| `/cold-email sequence` | T1 plus the Day 3 / 7 / 14 follow-ups | `cold-email-craft` |
| `/cold-email subject` | Subject lines by framework, scored | `cold-email-subject-lines` |
| `/cold-email lint` | Deterministic spam-trigger scan of a draft | `cold-email-spam-lint` |
| `/cold-email deliverability` | 15-point pre-campaign domain health check | `cold-email-deliverability` |
| `/cold-email list` | Score and clean a prospect CSV / JSONL | `cold-email-list-quality` |
| `/cold-email reply` | Classify one reply or a batch | `cold-email-reply-scoring` |
| `/cold-email nurture` | 5-email re-engagement stream for prospects who have not opted in | `cold-email-nurture` |
| `/cold-email audit` | 30-point outbound program audit | `cold-email-audit` |
| `/cold-email rhythm` | This week's Mon / Wed / Fri queue | `cold-email-weekly-rhythm` |

## Core principles (the JMC stance)

1. **A cold email is a hire — not a search query.** Every prompt anchors
   on a Pain Signal Profile, names the constraint, and forces the output
   into a shape you can ship.
2. **No demographics in the opener.** "VP of Marketing at Series B SaaS"
   isn't a signal. "Just posted a job for a Demand Gen Lead" is.
3. **Binary CTAs only.** "Worth 15 minutes Thursday?" not "Let me know
   if you'd like to learn more."
4. **<90 words for the first touch.** Anything longer signals desperation.
5. **One specific ask per email.** Stack-ranked asks confuse buyers.
6. **No "Hope you're well" / "Just bumping this".** Banned openers.

## Workflow router

When invoked, detect the user's intent and route to a sub-skill:

| User says | Route to |
|---|---|
| Bare `/cold-email`, "where do I start", "what's next" | `cold-email-kickoff` |
| "Set up my brand config", "configure my voice" | `cold-email-onboarding` |
| "Write a cold email to..." | `cold-email-craft` |
| "Build a 3-touch / follow-up sequence" | `cold-email-craft` (sequence mode) |
| "Suggest subject lines", "critique this subject" | `cold-email-subject-lines` |
| "Spam-check this", "will this land in spam" | `cold-email-spam-lint` |
| "Is my domain ready to send?", SPF / DKIM / DMARC | `cold-email-deliverability` |
| "Score / clean my send list" | `cold-email-list-quality` |
| "Score this reply", "triage my replies" | `cold-email-reply-scoring` |
| "Re-engage cold or stalled prospects" (not opted in) | `cold-email-nurture` |
| "Audit my outbound program" | `cold-email-audit` |
| "What's this week's queue", "Friday review" | `cold-email-weekly-rhythm` |
| "Review / score this draft" | `cold-email-reviewer` agent |

If intent is ambiguous, ask one clarifying question — never two.

## Variables (sub-skills inherit these)

The core framework operates on seven variables. Capture them once,
reuse across all sub-skills:

| Variable | Source | Example |
|---|---|---|
| `firstName` | Recipient list | Sarah |
| `role` | LinkedIn / CRM | VP of Demand Gen |
| `company` | Same | Acme Cloud |
| `signal` | Public signal — job post, funding, product launch, leadership change | "Just posted 'Senior Demand Gen Lead' role on LinkedIn 4 days ago" |
| `pain` | Pain Signal Profile — what the signal implies | "Pipeline gap; existing demand gen motion isn't producing enough SQLs" |
| `evp` | Your one-line value prop in their words | "We help Series-B SaaS hit pipeline targets without hiring 2 more SDRs" |
| `senderName` | You (`brand-config.operator.name`) | Jay |

If any are missing, ask the user — don't fabricate.

## Self-check rubric (run on every output before showing it)

`AGENTS.md` rule 5 points here. A draft that fails any hard check is
regenerated, not shown with a caveat.

**Hard checks — first touch**

- [ ] Body under 90 words (T2/T3 under 70, T4 under 60)
- [ ] Line 1 quotes the signal verbatim, and the signal is something
      they *did*, not who they *are*
- [ ] Pain is one sentence in the buyer's vocabulary
      (`brand-config.psp.vocabulary` when present)
- [ ] EVP is 22 words or fewer, names one outcome and one tradeoff
- [ ] Exactly one ask, answerable yes / no
- [ ] No pattern from `references/banned-patterns.md` or
      `brand-config.tone.banned_phrases` / SOUL.md "never" list
- [ ] Subject 7 words or fewer; no ALL CAPS, emoji, clickbait, or fake `Re:` / `Fwd:`
- [ ] No unmerged tokens (`{{firstName}}`, `<company>`)
- [ ] Nothing invented: every name, signal, metric, and case study came
      from the operator or a source they gave you

**Deterministic checks — run when Bash is available**

- `score_letter.py` on the signal + body: exit 0 (signal quoted, no
  demographics, under 90 words, one yes/no ask)
- `cold-email-spam-lint` on subject + body: score 75 or higher
- `cold-email-subject-lines` scorer on the subject: score 70 or higher

**Flag, don't hide** — if the signal, pain, EVP, or vocabulary was a
guess, say which line is uncertain and what data would settle it
(`AGENTS.md` rule 10).

## Running the bundled scripts

The deterministic scripts live in `scripts/` at the plugin root. The
sub-skills call them as `${CLAUDE_PLUGIN_ROOT}/scripts/<name>.py`, which
Claude Code resolves to the installed plugin, so they work from any
project directory. Outside Claude Code (for example, a manual run inside
this repo), `python3 scripts/<name>.py` from the repo root is the same
script. All scripts are Python 3.8+ stdlib only; DNS checks need `dig`.

| Script | Used by |
|---|---|
| `score_letter.py` | `cold-email-craft`, self-check (before the spam lint) |
| `spam_word_lint.py` | `cold-email-spam-lint`, self-check |
| `score_subject_line.py` | `cold-email-subject-lines`, self-check |
| `score_reply.py` | `cold-email-reply-scoring` |
| `score_list.py` | `cold-email-list-quality` |
| `check_deliverability.py`, `dig_dns.sh` | `cold-email-deliverability` |

## Works with the suite

This is step 4 of the GTM operator suite (`/plugin marketplace add cmj-hub/gtm-operator-skills`).

- **Reads:** `psp`, `evp`, `icp`, `tone`, `infrastructure`, `operations` from `brand-config.json` if present.
- **Writes:** `tone`, `infrastructure`, `operations`. Merge at the field level; never overwrite another pack's keys.
- **Before this:** psp (`/psp:psp`) and evp (`/evp:evp`), when there is no `psp` or `evp` block; prospect-list (`/prospect-list:who-to-contact`), when you do not yet know who to contact.
- **Instead of this:** sales-offer (`/sales-offer:cold-offer`), when the first touch should hand over a leak and a prototype rather than ask.
- **After this:** email-sequence (`/email-sequence:lifecycle-email`), when a prospect replies and opts in.

If a companion pack is not installed, name it and its install line (`/plugin install <name>@gtm-operator-skills`); do not do its job inline.

## References

Load these on demand for deeper context:

- [references/jmc-framework.md](references/jmc-framework.md) — The full JMC cold email framework
- [references/banned-patterns.md](references/banned-patterns.md) — Lines / openers / closes that fail
- [references/binary-ctas.md](references/binary-ctas.md) — 30 binary CTA patterns
- [references/psp-anchors.md](references/psp-anchors.md) — How to derive signal → pain → EVP
- [references/bulk-sender-rules.md](references/bulk-sender-rules.md) — Google / Yahoo / Microsoft sender requirements
- [SOUL.md](../../SOUL.md) — Operator voice template (the shape `cold-email-onboarding` fills in)
- [examples/t1.email.md](../../examples/t1.email.md) — A first touch that passes every check (lints at 100)
- [examples/spam.email.md](../../examples/spam.email.md) — A draft the spam lint rejects

## Sub-skills

- [`cold-email-kickoff`](../cold-email-kickoff/SKILL.md) — State-aware router and status
- [`cold-email-onboarding`](../cold-email-onboarding/SKILL.md) — brand-config.json + SOUL.md setup
- [`cold-email-craft`](../cold-email-craft/SKILL.md) — Single email + 3-touch sequence drafting
- [`cold-email-subject-lines`](../cold-email-subject-lines/SKILL.md) — Subject-line patterns by framework
- [`cold-email-spam-lint`](../cold-email-spam-lint/SKILL.md) — Deterministic spam-trigger scanner
- [`cold-email-deliverability`](../cold-email-deliverability/SKILL.md) — 15-point pre-campaign domain health
- [`cold-email-list-quality`](../cold-email-list-quality/SKILL.md) — Prospect list scoring + dedup
- [`cold-email-reply-scoring`](../cold-email-reply-scoring/SKILL.md) — Deterministic reply classifier
- [`cold-email-nurture`](../cold-email-nurture/SKILL.md) — 5-email re-engagement stream (not opted in)
- [`cold-email-audit`](../cold-email-audit/SKILL.md) — 30-point outbound program audit
- [`cold-email-weekly-rhythm`](../cold-email-weekly-rhythm/SKILL.md) — Mon / Wed / Fri operating cadence

## Specialist agents

- [`cold-email-reviewer`](../../agents/cold-email-reviewer.md) — Quality scorer (0-100) against framework
- [`cold-email-deliverability-auditor`](../../agents/cold-email-deliverability-auditor.md) — DNS/reputation specialist

## Free hosted version

The same job runs in a browser, no install and no key:
[Cold Email Linter](https://jaymountconsulting.com/tools/cold-email-linter)