list-building

Installation
SKILL.md

List Building

A BDR, RevOps operator, or marketing lead with a TAM in hand has two failure modes: hand-stitch the audience-to-campaign handoff (slow, error-prone, ICP drift) or skip suppression and burn EB workspace reputation on already-contacted leads. This skill is the third option — it consumes any of three TAM sources, runs cross-workspace EB exclusion + SF Lead suppression where the source needs it, enriches to verified contact-level via the resolved enrichment provider, SMTP-verifies, applies the free-email filter, and emits a single enriched_leads.csv ready for launch-campaign or campaign-orchestration.


Before Starting

Check for product marketing context first. If docs/marketing-context.md exists, read it before asking questions and use that context for Brite entity selection, voice, and ICP. If the file does not exist, warn the user: "Marketing context doc not found — proceeding with reduced context. Run /marketing:product-marketing-context to generate it." Then continue using only user-provided information.

Input-source detection

The skill consumes ONE of three input sources per invocation. Detection logic when source-mode flags are not passed: call AskUserQuestion listing the 3 source modes with brief descriptions. NEVER silently default.

Source 1 — tam-mapping output. Detect by directory pattern: --input-dir docs/campaigns/labs/tam/<slug>/ (Labs path) or docs/research/tam/<vertical>-<YYYY-MM-DD>/ (Nites/Supply path). Skill reads the appropriate output file in stable order: tier-a.csvtier-b.csvtier-c.csv (Labs) OR enriched.jsonlnet_new_leads.csv (Nites/Supply). Skips Workflow 2 (EB-exclusion) — tam-mapping Phase 4.5 already ran exclusion against both EB workspaces + SF; re-running wastes EB API calls and may misclassify leads if EB state shifted between runs. Staleness gate: check the validated --input-dir's mtime via python3 -c 'import os, sys, time; print(time.time() - os.path.getmtime(sys.argv[1]))' "$INPUT_DIR" (argv-passed; no shell interpolation — --input-dir was already path-validated at Workflow 1 step 0). If age > 7 days, fire AskUserQuestion with TWO options: (1) Skip Workflow 2 (default — preserves the per-source routing rule). Default action; output proceeds with stale-but-honored upstream exclusion. (2) Override and re-run Workflow 2. Explicit user opt-in to re-run cross-workspace EB + SF exclusion against fresh state. Default = (1) so the routing-table contract holds; only an explicit user choice activates the override path documented in § Methodology > Per-source EB-exclusion routing. Never silently skip the staleness check itself.

Source 2 — dbt audience CSV. User passes --audience-csv <path> + --audience-view-name <name>. Skill reads CSV via Read. Skill reads the dbt model definition via Bashgh api repos/Brite-Nites/brite-data-platform/contents/models/marts/<view>.sql for column-shape reference + audit logging only — does NOT execute the model (no Snowflake MCP exists; the dbt models materialize in Snowflake out-of-band). Runs Workflow 2 (EB-exclusion) before enrichment.

Source 3 — manual CSV. User passes --input-csv <path>. Skill validates required columns (domain + company_name minimum). Runs Workflow 2 (EB-exclusion) before enrichment.

Installs
1
First Seen
Jun 16, 2026
list-building — brite-nites/brite-claude-plugins