List quality
A CSV of 5,000 leads is not the same as a good list of 5,000 leads. This skill grades any list across 8 content-side dimensions BEFORE you spend on enrichment or burn inbox reputation on bad sends. Catches preventable waste in 5 minutes.
Claude Code triggers
Invoke when user says:
- "Grade this list"
- "List quality check"
- "Is this list ready to send"
- "List scorecard for [file]"
- "What's wrong with my list"
- "Should I enrich this or fix it first"
Do NOT invoke when:
- User wants per-account fit assessment →
/lead-scoring - User wants email validation only (no content-side checks) →
/deepline-enrichalready covers this - User wants post-send reply analysis →
/reply-scoring - List is < 100 rows → sample too small for the rubric; just eyeball
Auto-suggest after: any list-building skill (apollo-find, clay-search, jobs-signal, niche-signal) produces a CSV. The pipeline order is:
list-builder → list-quality → deepline-enrich → outreach/apollo-sequences
Running list-quality BEFORE deepline-enrich saves $0.05-0.20 per row in wasted enrichment spend on lists that wouldn't pass the gate anyway.
Input requirements
Required
| Input | Description | Source |
|---|---|---|
| CSV file | Contact list with at minimum: email, first_name, last_name, title (or job_title), company_name (or company) |
Output from any list-builder |
Optional (improves quality significantly)
| Input | Purpose |
|---|---|
company_domain (CSV column) |
If absent, derived from email; explicit column improves dedup accuracy |
company_industry (CSV column) |
Required for the icp_fit dimension |
company_headcount (CSV column) |
Required for the icp_fit dimension |
| ICP file path | projects/consulting/active/{client}/icp/MMYY-icp-research.md — provides the title taxonomy, target industries, headcount range. Without this, icp_fit and title_relevance fall back to defaults. |
| Verification status | If column verification_status exists with values `valid |
Validation: CSV is parseable; ≥100 rows; required columns present. If <100 rows, refuse with: "Sample too small (N rows). Eyeball it instead."
Process
Five phases — full step detail in the premium reference.
- Phase 1 — Load + normalize. Parse CSV, lowercase emails, derive
company_domainfrom email if missing, mark missing columns. - Phase 2 — Score 8 dimensions. Apply per-dimension scoring rules from the premium reference. Each dimension returns a 0-100 score.
- Phase 3 — Composite + grade. Weighted average across the 8 dimensions (verification + ICP fit weighted 2× per dimension docs); map composite to A+ to F via the premium reference.
- Phase 4 — Top issues + checklist. Surface the 5 highest-impact problems in priority order with row counts and concrete fix actions; emit pre-send checklist.
- Phase 5 — Write report. Markdown scorecard per the premium reference saved alongside the input CSV.
MCP data integration
Pulls fresh: none — this skill is pure CSV analysis, no MCP calls. Uses the Genesys Deepline waterfall's verification status if present in the CSV (column verification_status), but does not call Deepline directly.
Fallback: if verification_status column is missing AND the email-side dimensions can't run (verification, catch-all density), the report explicitly says "EMAIL-SIDE DIMENSIONS DEFERRED TO DEEPLINE-ENRICH" and grades only the 5 content-side dimensions, with a note that the final grade may shift after enrichment.
Validation: every dimension score is reproducible — running the skill twice on the same CSV produces identical results.
Quality
Pre-delivery checklist + minimum row threshold + composite weighting: the premium reference.
Headline rules:
- Minimum row count: 100. Below that → refuse to grade.
- Composite weighting: verification + ICP fit weighted 2× the others (these two are the load-bearing dimensions for outbound success).
Anti-hallucination guardrails
- Never invent ICP fit if no ICP file is provided. Surface as "ICP_FIT: NOT EVALUATED — provide --icp-file to enable" rather than guessing.
- Never invent title relevance. Without an ICP file, fall back to a default seniority filter (Director+ counts; Manager and below flagged) but explicitly mark as "DEFAULT FILTER — provide ICP for accurate scoring."
- Don't hide failed dimensions. If a dimension can't run (missing column, no ICP file), it appears in the report with status NOT EVALUATED, not omitted.
- Cite row counts for every issue. "23 emails are duplicates" — never "many duplicates."
- Never auto-modify the input CSV. This skill grades; it doesn't fix. Fixes happen in the next step (back to list-builder, or via a separate cleanup script).
Integration with other skills
Upstream (recommended, not required):
apollo-find,clay-search,jobs-signal,niche-signal— produce the CSVs this skill gradesicp-research— theicp/MMYY-icp-research.mdprovides the title taxonomy + industry filter for ICP-based dimensions
Downstream (gated on grade ≥ B):
deepline-enrich— only run on lists that pass list-quality at B+. Saves $0.05-0.20/row on bad lists.apollo-sequences— only enroll on lists at B+ (lower grades burn inbox reputation)outreach(runner mode) — only batch-generate on B+ listsabm-campaign— account-level overlay on a graded list
Sideways:
lead-scoring— different layer (per-account fit + signals); list-quality runs first (mechanical hygiene), lead-scoring after on the qualified subset/reply-scoring— closes the measurement loop: list-quality before send, reply-scoring after
Final ship gate
Run /premortem --output before ship. See /premortem skill for the 5 execution domains (will-it-resonate / will-it-convert / will-it-stay-on-brand / will-stakeholder-push-back / will-it-degrade-over-time) and output template.
Trivial-case escape: ## Premortem\nNo failure modes — trivial change satisfies the contract for genuinely trivial outputs.