contact-enrichmentlisted
Install: claude install-skill automatewithuday/gtm-prospecting-system
# Contact Enrichment
Two lanes arrive here with different shapes: accounts that need people, and people that need emails. One file leaves.
## Pipeline contract
**Stage 8 of 20.** Reads `07-accounts.csv` + `07-lane.json` (account lane) and `06-audience-qualified.csv` (audience lane). Writes `08-leads.csv` with the lead columns.
Files live in `runs/<run>/`. Column definitions: [`/prospecting-system`](../prospecting-system/SKILL.md).
**Gate:** the human approves `07-accounts.csv` before any contact pull. This is where real money starts.
## Lane A — accounts → people
```bash
npx tsx engine/list-builder/scripts/contacts.ts --config=<run>/07-lane.json --run-dir=<abs path to run>/07-lane
```
Cost-ordered waterfall, resumable: GetLeads export (free on plan) → Blitz for domains GetLeads left at zero → Prospeo people search last (paid). It refuses to run unless the lane's `summary.md` says READY. Output is `leads-final.csv` in the lane dir.
The engine pulls **all matching titles at every company, uncapped** — that is its rule, keep it. The run's target is enforced later, at stage 11, by ranking; not here by dropping contacts.
Set `source_type` to `lookalike` for accounts that came from `03-lookalikes.csv`, else `search`.
## Lane B — audience members → emails
Rows in `06-audience-qualified.csv` with `qualified=true` and no email:
1. Has `linkedin_url` → GetLeads MCP `getleads_get_emails_from_linkedin_batch`.
2. No LinkedIn URL but name + company → `getleads_enrich_person_ba