$npx -y skills add chacosoldier/compabob --skill build-listBuild a ranked, CRM-deduped outbound prospect list from an ICP description. Use for "/build-list", "find me leads matching X", "build a prospect list for Y", or when the user wants a scored outbound list. Orchestrates discovery + the lead-pipeline module + enrichment.
| 1 | # Build List |
| 2 | |
| 3 | Turn an ICP description into a ranked, deduped, CRM-aware outbound list using the |
| 4 | `lead-pipeline` module. You run the judgement/IO steps (discover, enrich); the |
| 5 | script runs the deterministic steps (clean, dedup, score). The cardinal rule: |
| 6 | |
| 7 | > **Dedup against the CRM before enriching.** Never spend enrichment effort or |
| 8 | > credits on accounts the user already knows. Known accounts become warm intros. |
| 9 | |
| 10 | ## Preconditions |
| 11 | |
| 12 | - A CRM to dedup against: `data/crm-merge/contacts.json`. If it is missing, tell |
| 13 | the user to run `/merge-contacts` first (dedup is the whole point); offer to |
| 14 | proceed without it only if they insist, noting every lead will be `proceed`. |
| 15 | - An ICP rubric at `modules/lead-pipeline/icp.json`. If only `icp.example.json` |
| 16 | exists, copy it and adjust it to the user's request before scoring. |
| 17 | |
| 18 | ## Steps |
| 19 | |
| 20 | 1. **Read the ICP from the request.** Pull out: industry/segment, geography, |
| 21 | company-size band, and target buyer titles. Confirm anything ambiguous in one |
| 22 | short question rather than guessing. |
| 23 | |
| 24 | 2. **Discover candidates → raw CSV.** Use the web-search MCP (e.g. exa |
| 25 | `web_search_exa` / `linkedin_search_exa`) to find matching accounts. Write a |
| 26 | CSV to `reports/lead-pipeline/00-raw.csv` with whatever you found across these |
| 27 | columns: `company, domain, contact_name, contact_email, title, country` |
| 28 | (partial rows are fine; later stages fill gaps). If no search MCP is |
| 29 | available, ask the user for a raw CSV and skip to step 3. |
| 30 | |
| 31 | 3. **Clean** (script): |
| 32 | ```bash |
| 33 | python3 modules/lead-pipeline/pipeline.py clean \ |
| 34 | --in reports/lead-pipeline/00-raw.csv \ |
| 35 | --out reports/lead-pipeline/01-cleaned.csv --country <codes> |
| 36 | ``` |
| 37 | |
| 38 | 4. **Dedup against the CRM** (script): |
| 39 | ```bash |
| 40 | python3 modules/lead-pipeline/pipeline.py dedup \ |
| 41 | --in reports/lead-pipeline/01-cleaned.csv \ |
| 42 | --crm data/crm-merge/contacts.json \ |
| 43 | --out reports/lead-pipeline/02-deduped.csv |
| 44 | ``` |
| 45 | Report the split: how many `proceed` (cold), `warm` (known account, route via |
| 46 | `crm_known_contact`), `skip` (already known, drop from outbound). |
| 47 | |
| 48 | 5. **Enrich the survivors only.** For rows tagged `proceed` or `warm` that lack a |
| 49 | domain / email / decision-maker, enrich with whatever you have, in this order: |
| 50 | - web search MCP for the company domain + LinkedIn (high hit-rate, cheap), |
| 51 | - an enrichment provider MCP (e.g. Clay) for verified emails — check remaining |
| 52 | credits first, and only for rows still missing an email, |
| 53 | - public business registries for named decision-makers at small firms when |
| 54 | enrichment misses. |
| 55 | Never enrich `skip` rows. Write the enriched result back to |
| 56 | `reports/lead-pipeline/02-deduped.csv` (or a `02b-enriched.csv`). |
| 57 | |
| 58 | 6. **Score** (script): |
| 59 | ```bash |
| 60 | python3 modules/lead-pipeline/pipeline.py score \ |
| 61 | --in reports/lead-pipeline/02-deduped.csv \ |
| 62 | --icp modules/lead-pipeline/icp.json \ |
| 63 | --out reports/lead-pipeline/03-scored.csv --top 50 |
| 64 | ``` |
| 65 | |
| 66 | 7. **Hand back** the ranked top-N (path `reports/lead-pipeline/04-top-*.csv`), |
| 67 | the disposition split, and the tier distribution. Call out the `warm` |
| 68 | accounts explicitly: those are the highest-value, lowest-risk plays. |
| 69 | |
| 70 | ## Guardrails |
| 71 | |
| 72 | - Do not send anything. This builds a list; outreach is a separate, reviewed step |
| 73 | (see the `linkedin-outreach` module). |
| 74 | - Respect data-protection law and platform terms. Flag if the user's target list |
| 75 | looks like scraped personal data being repurposed for cold mail. |
| 76 | - If a stage's numbers look wrong (e.g. zero `skip`/`warm` with a populated CRM), |
| 77 | inspect the stage CSV before continuing — that is why each stage is a file. |
| 78 | - Be honest about enrichment misses; report the hit-rate rather than fabricating |
| 79 | emails. |