--- name: icp-prompt-builder description: Interactive loop that builds and tunes an AI prompt for evaluating whether a company fits a client's ICP. Run after any list-building skill (disco-like, blitz-list-builder, google-maps-list-builder, prospeo-full-export) to qualify companies before scaling. Iterates batches of 10 companies with user feedback, stops when 2 consecutive rounds have zero corrections, saves the final prompt for reuse. Always uses Claude Code Task sub-agents — never an external API key. --- # ICP Prompt Builder Before you pay to pull 5,000 companies, tune a qualification prompt on 10-50 of them. This skill walks you through the iterative loop. ## Why this exists List-builder skills (DiscoLike, Blitz, Prospeo, Google Maps) return COMPANIES, but they don't know whether those companies match your ICP. If your list-builder returns 5,000 companies and 80% are wrong fits, you'll waste money enriching them for emails that go nowhere. The fix: build an AI qualification prompt BEFORE scaling. Pull 10 companies, have the prompt score them, compare to your judgment, refine, repeat. Once the prompt agrees with you 2 rounds in a row with zero corrections, lock it in and apply it at scale. ## Always uses Task sub-agents (no API key) This skill runs entirely inside Claude Code via the Task tool. No Anthropic SDK calls, no OpenAI calls — Claude Code does the scoring itself. This is intentional: - **No extra API spend.** Uses your Claude Code plan. - **No key management.** Works out of the box. - **Scaleable within reason.** For 20-100 evaluations, parallel Task sub-agents batch 10-20 companies per agent. At very large scale (5,000+ companies per batch), you may want to export the tuned prompt and run it through the OpenAI / Anthropic API with parallelism for speed. But TUNING happens inside Claude Code. ## The loop (8 steps) ### Step 1 — Gather ICP context Claude asks the user (or reads `client-profile.yaml` from `/icp-onboarding`): - Website of the client selling (to scrape for context) - Who IS a good customer? What makes them a good fit? - Who is NOT a good customer? What disqualifies them? - Any specific signals? (B2B only, revenue range, tech stack, hiring status, recent fundraise, etc.) - Any HARD disqualifiers? (competitor domains, existing customer domains, certain industries/geographies) ### Step 2 — Select 10 test companies Pull 10 companies from the list-builder output: - Mix likely-good and likely-bad fits - Variety in industry, size, location - Each company needs at minimum: `domain, company_name, industry, headcount, description` - Richer fields (Clay-derived: Business Type, Scale Scope, Revenue) make scoring better ### Step 3 — Build the initial qualification prompt Template: ``` You are an ICP evaluator for {CLIENT_NAME}. ## Target ICP {ICP description from user or client-profile.yaml} ## Qualification criteria (MUST be true) - {criterion 1} - {criterion 2} - ... ## Disqualification criteria (ANY match = disqualify) - {disqualifier 1} - {disqualifier 2} - ... ## Input You will receive a company with these fields: - domain, name, industry, headcount, description - (optional) Business Type, Revenue, Scale Scope ## Output For each company, return JSON: { "qualified": true | false, "confidence": 0.0-1.0, "reason": "one-sentence explanation" } ``` ### Step 4 — Run the prompt on the 10 companies Via the Task tool. Launch one Task sub-agent that reads the prompt + 10 companies, returns 10 JSON scores. ### Step 5 — Present results to the user Format as a table: ``` Company | Qualified | Conf | Reason --------------------------+-----------+------+---------------------------------------- acme-corp.com | YES | 0.92 | B2B SaaS, 200 employees, target industry random-nonprofit.org | NO | 0.95 | Nonprofit, not a business customer edge-case-company.com | YES | 0.55 | Could fit but revenue model unclear ``` ### Step 6 — Collect user feedback Ask specifically: - Which evaluations are wrong? (e.g., "acme-corp should be NO because they're a competitor") - Which are right but for the wrong reason? - Any patterns the prompt missed? - Any new disqualifiers to add? If the user has zero corrections, log this round as "approved." ### Step 7 — Refine the prompt (or move on) If the user gave corrections: - Add/remove qualification criteria - Tighten/loosen disqualifiers - Add specific examples of edge cases ("companies like X are NOT a fit because Y") - Adjust confidence thresholds if everything is coming back 0.5 Then go back to Step 4 with a NEW batch of 10 companies. ### Step 8 — Stop condition + save The loop ends when **2 consecutive rounds have zero corrections from the user**. When that happens: 1. Save the final tuned prompt to `~/cold-email-ai-skills/profiles//icp-prompt.txt` 2. Append metadata to `client-profile.yaml`: ```yaml icp_qualification_prompt: path: profiles//icp-prompt.txt tuned_at: YYYY-MM-DD rounds_to_convergence: 3 final_batch_size: 10 ``` 3. Print a one-liner for the next skill: ``` Prompt locked. To score your 5000 companies: npx tsx ~/cold-email-ai-skills/skills/list-expander/scripts/score-batch.ts \ --prompt-file=profiles//icp-prompt.txt \ --companies=path/to/companies.csv \ --out=scored.csv ``` ## Approval-loop rules (important) - **Never auto-approve.** Even if the prompt looks right, require the user to explicitly say "approved" or give zero corrections for 2 consecutive rounds. - **Reset counter on any correction.** One correction resets the streak to 0. - **Don't skip the batches.** Running 30 companies all at once feels faster but masks errors. 10 at a time is the right batch size — small enough to eyeball. - **Show the prompt each round.** After each refinement, display the current full prompt back to the user so they can see what changed. - **Always use Task tool sub-agents** for the scoring inside each round. Never call external APIs. ## Using the tuned prompt at scale Once saved, the prompt is applied to the full list via `list-expander/scripts/score-batch.ts`. Options: **Option A (free, slow)** — run through Claude Code Task sub-agents in batches of 20 companies per agent. Good for <500 total. **Option B (paid, fast)** — export prompt + companies to OpenAI / Anthropic API with parallelism. Good for 500-50,000. The script supports both. Default is Option A to keep everything inside Claude Code. ## Recommended flow 1. `/icp-onboarding` → produce `client-profile.yaml` 2. `/disco-like` OR `/blitz-list-builder` OR `/prospeo-full-export` → pull a sample of 50-100 companies 3. `/icp-prompt-builder` → tune qualification prompt on that sample (3-5 rounds typical) 4. Scale the list-builder to 5,000+ companies 5. Apply the tuned prompt to the full list → only keep `qualified: true` with `confidence >= 0.6` 6. `/blitz-list-builder` or `/list-builder` (Phase 5, emails) on the qualified subset 7. Upload to Smartlead ## Data points the prompt can use From most list-builder outputs: - domain, company_name, industry, headcount, description, LinkedIn URL Additional fields (if enrichment skills have been run): - Business Type (B2B / B2C / B2B2C) - Annual Revenue range - Scale Scope (Enterprise / Mid-Market / SMB) - SubIndustry (more specific than primary industry) - Tech stack (Clearbit, BuiltWith data) - Recent signals (funding, hiring, news) Tell the AI about the fields you have access to in the prompt preamble. ## Common mistakes - **Building the prompt too tight on round 1.** Start broad, narrow with feedback. - **Not including negative examples.** "Companies like Netflix are NOT a fit because they're B2C" is more powerful than generic "must be B2B". - **Using only "qualified: true/false" without confidence.** Always ask for confidence — 0.5-0.7 borderline cases are where you learn the most. - **Scoring 50 at once "to save time."** Defeats the point of the loop. - **Not saving the prompt.** The point of tuning is reuse. If you don't save, you'll re-tune next time. ## Scripts - `scripts/score-batch.ts` — apply tuned prompt to a CSV of companies ## What to do next **Apply the tuned prompt to your full list** (the list-building skill you came from — Prospeo, Blitz, DiscoLike, Google Maps, or Competitor Engagers — will walk through this). Then `/list-quality-scorecard` to grade the filtered output. **Or wait:** if the prompt didn't converge within 5 rounds (you kept making corrections), your source data may be too thin. Enrich with more fields (company description, headcount, tech stack) before retrying. ## Related skills - `/icp-onboarding` — run FIRST to produce client-profile.yaml - `/disco-like`, `/blitz-list-builder`, `/google-maps-list-builder`, `/prospeo-full-export` — pull the companies this skill qualifies - `/personalization-subagent-pattern` — same approval-loop pattern, applied to copy personalization