Install
$ agentstack add skill-growthenginenowoslawski-coldoutboundskills-list-quality-scorecard ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
List Quality Scorecard
A CSV of 5,000 leads is not the same as a good list of 5,000 leads. This skill grades your list across 8 dimensions BEFORE you send, catching preventable waste.
Why this exists
The three campaign failure modes cold email runners hit most:
- Bad list — the copy doesn't matter when you're emailing the wrong people
- Unverified emails — bounces burn domain reputation
- ICP drift — you think you're targeting VPs, but the list is mostly Managers
Each of these is catchable before you send, in 5 minutes, for free.
Inputs
A CSV with at minimum these columns:
email— the primary emailfirst_name,last_namejob_titleORtitlecompany_nameORcompanycompany_domain(optional, derived from email if missing)company_industry(optional, used for ICP fit scoring)company_headcount(optional, used for ICP fit scoring)
Output
A markdown scorecard with:
- Letter grade (A+ to F)
- 8 dimension scores (each 0-100)
- Top 5 issues to fix
- Pre-send checklist
Usage
npx tsx scripts/score-list.ts --list=leads.csv --icp-file=client-profile.yaml --out=scorecard.md
Optional --icp-file lets the scorecard compare your list against your declared ICP filters (from /icp-onboarding).
The 8 dimensions
1. Email verification coverage (critical)
- What: % of emails validated via MillionVerifier or equivalent
- Rule: 100% of a cold list must be verified before sending. Unverified emails = bounces = dead domains.
- Score: 100 if all verified, 0 if 5% is a problem
- Score: 100 at 0%, drops linearly
3. Duplicate domain rate
- What: max # of leads from any single domain
- Rule: 1-2 leads per domain ideal. 5+ suggests you're over-indexing on one company.
- Score: 100 if avg 5
4. Title relevance
- What: % of titles matching your ICP's job title list
- Rule: Exact-match + synonym list. If 40% of your "VP Sales" list is actually "Sales Manager", you have drift.
- Score: 100 if ≥80% match, 50 if 40-80%, 0 if 10% means your Prospeo filter is too loose
- Score: 100 if 15%
7. ICP fit
- What: % of leads matching your
client-profile.yamlfilters on industry + headcount - Requires:
--icp-filepassed - Rule: 80%+ match, 100 if exact
8. Name quality
- What: % with both firstname AND lastname populated AND looking human
- Checks: Not all-caps, not fake names ("Admin", "Info"), not email-as-name
- Rule: 95%+ acceptable
- Score: 100 if 95%+, drops linearly
Letter grade mapping
Weighted average across 8 dimensions (verification and ICP fit weighted 2x):
| Average | Grade | Action | |---|---|---| | 90-100 | A+ / A | Ship it | | 80-89 | B | Minor fixes, then ship | | 70-79 | C | Fix top 3 issues first | | 60-69 | D | Serious cleanup required | | 5 each) — cap at 3 per domain
- 258 leads outside declared industry filter (12%) — filter by company_industry
Pre-send checklist: [ ] Deduplicate by email [ ] Drop catch-all if >5% (reduces bounce rate) [ ] Filter out bad titles [ ] Cap per-domain concentration [ ] Re-run verifier if list shrunk >10%
## When to use
- AFTER list-building skills (`/prospeo-full-export`, `/blitz-list-builder`, `/google-maps-list-builder`, `/disco-like`)
- AFTER email waterfall (`/email-waterfall`)
- BEFORE Smartlead upload
## When NOT to use
- On a list of <100. Sample too small for reliable stats.
- On a fully static list (same every send). Check once, reuse.
## Scripts
- `scripts/score-list.ts` — the main scorecard
## What to do next
**If grade ≥ B:** `/campaign-copywriting` to write the emails. Then `/smartlead-campaign-upload-public` to launch as DRAFT.
**If grade < C:** fix the top 3 issues (from scorecard output), re-run this skill until grade ≥ B. Don't upload a C-grade list — bounces and low reply rates will damage domain reputation.
**Or wait:** if large fixes are needed (missing email verification, 30%+ bad titles), address those BEFORE spending more on email-finding or enrichment.
## Related skills
- `/icp-prompt-builder` — more surgical ICP fit scoring (AI per-company)
- `/icp-onboarding` — produces the `client-profile.yaml` this skill checks against
- `/email-waterfall` — run BEFORE this skill for verification coverage
## The 1% rule alignment
A list that scores below C-grade is very likely to produce reply rates below 1%, which violates the 1% rule (see `/email-deliverability-audit`). Catching list issues here saves you the deliverability hangover later.
## Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [growthenginenowoslawski](https://github.com/growthenginenowoslawski)
- **Source:** [growthenginenowoslawski/coldoutboundskills](https://github.com/growthenginenowoslawski/coldoutboundskills)
- **License:** MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.