auto-research-public
Autonomous cold email campaign launcher. Takes one target company domain, scrapes their…
Produces a copy-ready clause about a role a company is currently hiring for, filtered by language the client cares about (for example "cold call", "outbound prospecting", "Salesforce"). Triggers on "they're hiring", "job posting language", "who is hiring SDRs", "companies hiring
$ npx -y skills add growthenginenowoslawski/coldoutboundskills --skill playbook-job-posting-language --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/playbook-job-posting-languageContext preview
The summary Claude sees to decide when to auto-load this skill.
Produces a copy-ready clause about a role a company is currently hiring for, filtered by language the client cares about (for example "cold call", "outbound prospecting", "Salesforce"). Triggers on "they're hiring", "job posting language", "who is hiring SDRs", "companies hiring
name: playbook-job-posting-language
description: Produces a copy-ready clause about a role a company is currently hiring for, filtered by language the client cares about (for example "cold call", "outbound prospecting", "Salesforce"). Triggers on "they're hiring", "job posting language", "who is hiring SDRs", "companies hiring for X", "find the hiring signal", "what roles are they hiring for", "job description mentions". Outputs job_posting_line_safe, one lowercase clause that slots into "Saw {{job_posting_line_safe}}."> 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 angle is "you are hiring for this, and that is exactly what we help with". The client names the roles or the description language that signals a fit, and every row needs a specific, current opening to reference.
**Do not use when:** you want *how many* people they hired or headcount growth over time (`playbook-hiring-surge`). If you want to **find** companies hiring a role rather than enrich a list you already have, that is discovery mode — see note E.
**One-line output:** `job_posting_line_safe = "you're hiring an account executive for private equity"`
⚠️ **Never bind copy to the ungated `job_posting_line`.** The `_safe` field is the same value blanked whenever the posting is older than 30 days. §6 explains why that gate is not optional.
A company posts jobs. Those postings say what the company is **about to spend money on** and what problems it is trying to staff around. If a client sells to sales teams, "this company posted an SDR job three weeks ago and the description talks about cold calling" is a better opening line than anything you could invent.
This takes a list of domains you already have and puts one sentence fragment on each row. It covers **job-board-sourced postings only**. It does not scrape career pages by default, does not count hires over time, and does not find new companies.
It also carries a decision people get wrong constantly: **filter with keywords first, and only add an AI classifier if a measurement proves keywords are not enough.** Note C is that measurement, already run.
| Field | Type | Required? | |---|---|---| | `company_domain` (bare, lowercase) | string | yes | | `company_name` | string | yes — used by the mandatory name-match gate in §7 | | `keyword_set` | string[] | yes, **set once per campaign, not per row** | | `role_titles` | string[] | no, see note C | | `window_days` | number | no. **Default 60 to detect, 30 for claims in copy** |
| Field | Type | Example | Null? | |---|---|---|---| | `job_posting_line_safe` | string, ≤90 chars | `you're hiring an account executive for private equity` | no, use `""` | | `job_posting_line` | string | same | **ungated. Audit and debugging only, never in a send** | | `job_role_named` | string | `account executive for private equity` | no, `""` | | `job_evidence_url` | string | the posting URL | no, `""` | | `job_posted_date` | date | `2026-07-30` | no, `""` | | `job_confidence` | `high` / `low` | `high` | no |
**7/8 rows usable (87.5%).** Broken down honestly, because campaign setup needs the real shape: 5 of 8 produced a written line, 3 abstained, **all 3 abstains were correct.**
Expect roughly **60% of a healthy B2B software TAM to produce a line before the freshness gate.**
⚠️ **After the mandatory 30-day gate, plan on 35 to 40%.** Any row whose only posting is 31 to 60 days old blanks by design. On the live-test set that was **2 of the 5 generating rows** — one at 53 days (correctly killed, the role is gone from the company's live board) and one at 49 days that was **verified genuinely open** and the gate kills anyway.
**That second row is the cost of a blunt proxy: a real open role, killed by its age.** A source with a true "is this still open" boolean would keep it. The age proxy is what you have unless your source exposes live status.
So `job_posting_line_safe` **cannot be a mandatory variable in copy.**
exact frame.**
become `a partner development representative`. **That rewrite is the only thing the AI step exists for.**
If empty: drop the clause through spintax and keep the row. Do not exclude the row unless the client asked for a hiring-only segment — in which case exclude **at list build time, not at send time.**
| # | Source | Cost | Call | Result | |---|---|---|---|---| | 1 | **A jobs API keyed on the company's job-board profile** | often FREE / unlimited | resolve `domain → company profile`, then query postings with `date_posted.last_days: 60` and `description.include: [keywords]` | 5/8 companies returned a matched posting; **7/8 rows produced a correct final value** | | 2 | A second jobs provider, queried by bare domain | FREE on some plans | skips the profile-resolution step that step 1 can get wrong | run on every row step 1 could not answer, **or whose company name failed the name-match gate** | | 3 | A company-search API's open-jobs filters | FREE on some plans | company-level "are they hiring for this title" | **it gates and sizes, it does not quote** — it cannot produce an evidence URL | | 4 | A search API over the company's own careers page | METERED | one search per row | ⛔ **only when the operator explicitly asks. Never by default.** Career-page scraping is a different job with a different failure surface, and steps 1 to 3 are free | | 5 | The li
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…