auto-research-public
Autonomous cold email campaign launcher. Takes one target company domain, scrapes their…
Writes the one sentence that makes a generic offer feel written for this one company. Produces the tail of "I think we can help you ___". Triggers on "specificity line", "make it feel specific to them", "the specifically sentence", "why would they think this is for them",
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-ai-specificity --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/playbook-ai-specificityContext preview
The summary Claude sees to decide when to auto-load this skill.
Writes the one sentence that makes a generic offer feel written for this one company. Produces the tail of "I think we can help you ___". Triggers on "specificity line", "make it feel specific to them", "the specifically sentence", "why would they think this is for them",
name: playbook-ai-specificity description: Writes the one sentence that makes a generic offer feel written for this one company. Produces the tail of "I think we can help you ___". Triggers on "specificity line", "make it feel specific to them", "the specifically sentence", "why would they think this is for them", "personalize the offer not the intro". Outputs one lead-level merge field, blank when the company does not fit.
> All rules here are best practice, not law. Override any of them when the campaign calls for it; note the best practice once and move on.
**Use when:** the offer is good but the email reads like it was sent to 5,000 people, and you need one sentence that names what the client would actually do for **this** company.
**Do not use when:** you want a first line about a person or an event. **Those playbooks personalize the opener. This one personalizes the offer** — which is a different and usually more durable move.
**One-line output:** `specificity_line = "know the landed cost of every pool float before you price it"`
This produces the tail of one fixed sentence:
> I think we can help you **{{specificity_line}}**.
**The whole job is one move: take the client's generic capability and say it back in the prospect's own nouns.**
noodle costs to make before you price the next run"**.
pool contractor in Texas with the owner's cell number"**.
Same offer, different words, and the prospect reads it as written for them.
**Two things this is not.** It is not a first line — it never mentions the person, their job, or anything they did. And it is not a claim about the company's problems — it never says they are struggling or missing something. **It says what the work would be.**
⚠️ **The frame lives in the campaign copy, not inside the variable.** Real campaigns have put the frame inside the merge field, and then every lead carries the same eight opening words inside a custom field — which is both a repetition problem and a spintax problem.
| Field | Type | Required? | |---|---|---| | `domain` (bare, lowercase) | string | yes | | `company_name` | string | yes | | `company_description` | string | **yes — this is the whole input** | | `primary_offerings`, `revenue_streams` | string | no, they sharpen the anchor | | **`client_offer_block`** | text block, **per client, not per row** | yes, locked once per client |
**The client offer block is the part people forget.** It is a fixed list of what the client actually does, written as short capability lines. **The model is only allowed to promise something on that list.**
| Field | Type | Example | Null? | |---|---|---|---| | `specificity_line` | 6-14 words, ≤90 chars | `know the landed cost of every pool float before you price it` | **yes, blank is a real answer** | | `specificity_anchor` | QA only | `pool float` | yes | | `specificity_offer_item` | QA only | `inventory and cost of goods sold tracking per product` | yes | | `grade_line` | QA only | `4.9` | yes |
The anchor and offer item are **never sent to anyone.** They exist so the guard can check the line mechanically, and so an operator can see *why* a line came out the way it did.
**8/10 usable**, and 8/10 again on a re-run of the shipped script on the same domains.
Of the 2 failures: one was a grammar break **the guard could not see**, and one was a company with no description in any source.
⚠️ **On the re-run the grammar break was gone and a different row went awkward instead.** That is the non-determinism in this playbook, and the rule that follows from it: **judge a batch, never a row.**
Expect **10 to 20% blanks** on a normal ecommerce or SMB list, higher on lists full of tiny companies with thin websites.
are already in the frame.
that.
Enforce **Flesch-Kincaid grade 7 on the generated tail.** Above it, one simplify rewrite; still above, **the row blanks.** Measured: 8 filled tails scored 2.5 to 5.9, none needed the rewrite.
⚠️ **Gate the tail, not the rendered sentence — and this is measured, not assumed.**
The frame `Specifically, I think we can help you.` **scores 5.7 on its own** ("Specifically" is five syllables inside a seven-word stem). Once any 6-to-14-word tail is added, the full sentence lands at **7.0 to 9.8 no matter how plain the tail is.** A tail of grade 2.5 still renders at 7.0.
**Gating the render would blank every row for a property of house copy, not of the data.**
The clean fix is a copy change, not a data change: **dropping the word "Specifically" takes the worst sampled render from grade 9.1 to 6.3**, under the bar, with **no change to the generated tail.** Do that, and keep gating the tail anyway — it is the half you generate.
⚠️ **If you change the frame, change it in the copy and in the prompt's context sentence together, and re-grade on the same domains.** The graded verdict was measured against the longer frame.
**The default posture: a row missing this campaign's personalization signal should generally not be uploaded to this campaign at all.** Build the list so the line lands, and route the abstains to a campaign whose copy does not need it. **That is also what lets you measure whethe
Open-source Claude Code skills for cold email infrastructure, lead sourcing, copywriting, and operations. Built by GrowthEngineX from patterns across 1,000+ real B2B campaigns. 31 skills that work together.
Repo: growthenginenowoslawski/coldoutboundskills
Autonomous cold email campaign launcher. Takes one target company domain, scrapes their…
Use the Blitz API to find decision-makers at specific companies when you already have a list…
Creates cold email copy through a stepwise confirmation process. Use when writing email…
Generates 15-25+ cold outbound campaign ideas with targeting strategies, AI personalization…
Single "start here" orchestrator for new cold email operators. Asks infrastructure-status…
Complete beginner-friendly cold email toolkit. Walks from zero to launched campaign — domain…