LeadGrow
v3.0 Shipped

GTM Orchestrator

One command takes a client brief from "new campaign" to "ready for human checkpoint before Bison launch" — every intermediate CSV and state inspectable on disk and in Sheets throughout.

15
Pipeline Stages
43
Phases Shipped
30
Skills
826
Tests Passing
10
Milestones

System Architecture

Pipeline glue: brief → discovery → enrichment → qualification → copy → QA → launch. SQLite state mirrored live to Google Sheets.

State
SQLite per campaign
Source of truth. Per-row status, cost accumulator, stage metadata. Mirrored to Sheets via gws CLI.
LLM Runtime
lg-llm-runtime
All LLM calls routed through local editable runtime. Prompt schemas, cost tracking, retry logic. No direct API calls.
Campaign Ops
Bison Adapter
Wraps bison-cli for all email campaign operations. Create, upload leads, assign inboxes, launch. Dry-run support.
Visibility
Google Sheets Mirror
Nick Abraham's 7-tab hygiene structure. Account List, Enriched Contacts, Valid/Invalid/Catch-All/Public Emails, Suppression.
Dashboard
Next.js Web UI
Campaign list, per-campaign stage table, GitHub Issues (checkpoints). Reads from Sheets + GitHub API. Deployed to Vercel.
Enrichment
Clay CLI
Table setup, record push/export, webhook orchestration. 6-enrichment catalog: LinkedIn scrape, headcount, news, funding, tech stack, buying signal.
Python 3.12 uv SQLite lg-llm-runtime bison-cli gws CLI Clay CLI DiscoLike AI Ark Next.js 14 Vercel

Dependencies & Install

Everything the orchestrator needs to run. Python packages install via uv sync. External CLIs and services require separate setup.

Package Version Install Purpose
Python Core
Pythonrequired >=3.12, <3.13 python.org Runtime. 3.12 only — no 3.11 or 3.13.
uvrequired latest pip install uv Package manager. Replaces pip/poetry. All installs go through uv sync.
Python Packages — installed automatically via uv sync
lg-llm-runtimerequired local editable uv sync All LLM calls. Prompt schemas, cost tracking, retries, caching. Local editable at ../lg-llm-runtime.
typer >=0.24 uv sync CLI framework. Powers gtm-orchestrator run|resume|status.
pydantic >=2.13 uv sync Data validation. Brief parsing, stage configs, API responses.
structlog >=25.5 uv sync Structured logging. JSON-formatted pipeline events.
pyyaml >=6 uv sync YAML parsing. Briefs, manifests, checkpoint files, copy candidates.
dnspython >=2.6 uv sync MX record validation. Domain pre-filter at Stage 2.5.
rich >=15 uv sync Terminal UI. Progress bars, status tables, colored output.
questionary >=2.1 uv sync Interactive prompts. Checkpoint confirmation, inbox selection.
titlecase >=2.4.1 uv sync Company name normalization. Proper casing in Stage 2.
lg-llm-runtime Packages — pulled in via runtime
anthropic >=0.95.0 via lg-llm-runtime Claude API client. Primary LLM provider for ICP scoring, copy, QA.
openai >=2.20.0 via lg-llm-runtime OpenAI API client. GPT-4o-mini for graduated prompts, spider-agent.
httpx >=0.27.0 via lg-llm-runtime HTTP client. Serper search, Spider scraping, webhook calls.
aiosqlite >=0.20.0 via lg-llm-runtime Async SQLite. Runtime state store and response caching.
tenacity >=9.1.0 via lg-llm-runtime Retry logic. Exponential backoff on LLM rate limits.
orjson >=3.10.0 via lg-llm-runtime Fast JSON. Serialization for prompt cache and batch outputs.
python-ulid >=3.0.0 via lg-llm-runtime ULID generation. Sortable unique IDs for runs and cache keys.
Dev Dependencies
pytest >=9 uv sync --dev Test runner. 826 tests across unit + integration.
pytest-asyncio >=0.24 uv sync --dev Async test support. Required for runtime and adapter tests.
External CLIs — installed separately
bison-clirequired latest pip install bison-cli EmailBison campaign operations. Create, upload, launch, score replies.
multicaoptional v0.2.13+ go install github.com/LeadGrowGTM/multica Go binary. Multi-sender email validation. Pipeline never blocks on failure.
gws CLIrequired latest npm i -g gws Google Workspace CLI. Sheets mirror, Drive, Gmail. Auth: service account.
discolikerequired latest pip install discolike Lookalike company discovery from seed domains. Default Stage 1 source.
apify-clioptional v1.6.1+ pnpm build (cli/apify-cli) LinkedIn Jobs, Ads, and Employee discovery via Apify actors. TypeScript CLI with Python transform scripts.
API Keys — environment variables
ANTHROPIC_API_KEYrequired export ANTHROPIC_API_KEY=sk-… Claude API. Primary LLM for ICP scoring, copy generation, semantic QA.
OPENAI_API_KEYoptional export OPENAI_API_KEY=sk-… GPT-4o-mini. Graduated prompts, spider-agent search + scrape.
SERPER_API_KEYoptional export SERPER_API_KEY=… SerperDev Google search. Used by spider-agent web_search tool.
SPIDER_API_KEYoptional export SPIDER_API_KEY=… Spider Cloud. Used by spider-agent scrape_url tool. Residential proxy.
EMAILBISON_API_KEYrequired export EMAILBISON_API_KEY=… EmailBison API. Campaign creation, lead upload, inbox management.
CLAY_API_KEYoptional export CLAY_API_KEY=… Clay.com enrichment. Table automation, webhook orchestration.
APIFY_TOKENoptional export APIFY_TOKEN=… Apify cloud actors. LinkedIn Jobs, Ads, and Employee scraping.

The Pipeline

15 stages from brief to launch. Green = fully automated. Yellow = operator checkpoint. Orange = human gate.

STAGE 1
Discovery
Find target companies. DiscoLike lookalike search (default), Google Maps scrape, LinkedIn Jobs/Ads via Apify, or custom CSV.
Automated
STAGE 2
Normalize
Clay normalization — map columns, deduplicate, derive website from company_name. Clean leads ready for qualification.
Automated
STAGE 2.5
Domain MX Pre-Filter
Block security-gateway domains (Barracuda, Mimecast, etc.) before burning ICP qualification tokens on unreachable leads.
Automated
STAGE 3
ICP Qualify
LLM-powered ICP fit scoring via lg-llm-runtime. Strong/partial/weak classification with reasoning. Optional DiscoLike validate gate.
Automated
STAGE 4
People Find
AI Ark finds decision-maker contacts. Enriched rows with email + LinkedIn URL. Followed by waterfall email find (4b) and MX filter + provider detection (4c).
Automated
STAGE 5
Enrich
On-demand enrichments: LinkedIn scrape, team headcount, recent news, funding, tech stack, buying signal. Operator selects which to run. 6-enrichment catalog.
Checkpoint
STAGE 6
Segment
LLM classifier assigns leads to segments from the brief. Ambiguous leads (below confidence threshold) surface in tiebreak.csv for operator resolution.
Checkpoint
STAGE 7
Copy Generation
Dual-agent copy: Braun (prospect-voice, EDP-grounded) generates 2 variants, then campaign-copywriter generates 2 more. Operator picks winner per segment.
Checkpoint
STAGE 7b
Personalization
Per-lead AI personalization: situation_line, value_line, cta_soft. 10-lead sample approval loop. 2 zero-edit rounds locks prompt. Budget gate (default 500 leads).
Automated
STAGE 8
QA + Anneal
Rendered semantic QA on sampled leads → self-annealing spam fix loop → mechanical checks (spam words, variable syntax, lead-data audit) → variable conversion to Bison format.
Checkpoint
STAGE 85
Scorecard
Scores list quality on 8 dimensions pre-Bison upload. Grade F = hard-block (exit 7). Grade D = checkpoint. Grade C+ = proceed.
Checkpoint
STAGE 9
Bison Launch
7 substages: create campaigns, upload copy, select inboxes (checkpoint), upload leads, route, verify standards, human launch gate. Operator must sign off — no auto-launch.
Human Gate

Available Skills

30 skills across 8 categories. Invoke via slash command or natural language.

Click any skill to see what it consumes, produces, and when to use it.

Intake
+
icp-onboarding
/gtm:icp-onboarding
New client intake — interview, website crawl, CSV import, or transcript ingestion into icp-profile.yaml
InputsOperator interview answers, client website URL, optional CRM CSV or call transcripts
Outputicp-profile.yaml — structured ICP with verticals, titles, geo, deal size, exclusions, hard/soft filters
Use whenFirst time working with a client, or ICP needs a refresh. Always Step 1 before any campaign work.
HowConversational interview (13 questions), 3 confirmation rounds with source attribution per field. Spider crawl optional.
+
icp-ingestion
natural language
Auto-extract ICP from spider crawl + CSV + transcripts. Replaces manual 13-question onboarding with 3-round confirmation.
InputsClient domain (for spider crawl), CRM/account CSVs, call transcript files
Outputicp-profile.yaml — same format as icp-onboarding, auto-populated from data sources
Use whenClient has existing data (CRM exports, recorded calls) — faster than manual interview. Falls back to onboarding for gaps.
+
spider-waterfall
natural language
3-level progressive web scraping: local CLI → Spider Cloud API → BrightData premium proxy.
InputsTarget URL(s) to scrape
OutputCategorized page content: services, case_studies, pricing, about, team, blog
Use whenNeed structured content from prospect/client websites. Auto-escalates through 3 proxy tiers if blocked.
Research
+
research-gate
/gtm:research
Soft freshness gate — checks if Market Takeover Playbook exists and is current before campaign work proceeds.
InputsClient folder path (checks for existing research artifacts)
Outputresearch-status.yaml — freshness verdict (fresh/stale/missing) per research artifact
Use whenBefore starting campaign strategy or briefing. Warns on stale research but never blocks — soft gate.
+
stateful-research-chain
/gtm:research-chain
Modular 11-step FIND chain with SHA-256 staleness detection. Run full, single steps, or refresh-only modes.
Inputsicp-profile.yaml
Outputresearch/<slug>-takeover-playbook.md (prose) + -playbook-structured.yaml (machine-readable)
StepsCompetitor landscape, buyer journey, objection mining, pricing intel, channel analysis, content gaps, tech stack, hiring signals, market sizing, positioning, messaging angles
Use whenNew client or research older than 30 days. Can target individual steps: /gtm:research-chain --step 5
+
voice-of-market
/gtm:voice-of-market
Reddit prospect-language mining. Two-pass: keyword search → deep-dive posts → structured GTM analysis.
Inputsicp-profile.yaml (extracts keywords + subreddits from ICP)
OutputStructured analysis: pain points, buyer language, hooks, objections, ICP archetypes, content angles — all in prospect's own words
Use whenBefore writing copy. Reply rates below 1%. Entering a new market where you don't know how buyers talk about the problem.
Strategy + Copy
+
campaign-strategy
/gtm:campaign-strategy
Generate 15+ campaign ideas from ICP profile + market takeover playbook.
Inputsicp-profile.yaml + research/playbook-structured.yaml
Outputcampaign-strategy.yaml — 15+ ideas each with segment, angle, hook, expected reply rate, difficulty
Use whenAfter research is fresh. Operator picks 1-3 ideas to develop into briefs.
+
briefing-maker
/gtm:briefing
Synthesize ICP + research + strategy into a pipeline-ready brief with all required sections.
Inputsicp-profile.yaml + campaign-strategy.yaml + research artifacts
Outputbriefs/<slug>.md — Market, Segments, Personas, Angles, Rough Messaging, EDPs. Frozen at pipeline init.
Use whenReady to build a campaign. This is the single input to the 15-stage pipeline.
+
enrichment-selector
/gtm:enrichment-selector
Pick which enrichments to include in a brief based on ICP and campaign goals.
Inputsicp-profile.yaml + campaign goals
Outputenrichment-selection.yaml — which of the 6 enrichments matter for this campaign
Use whenBefore briefing, if unsure which enrichments add value. Optional — operator can pick manually at Stage 5 checkpoint.
+
campaign-copywriting
/gtm:campaign-copywriting
Dual-agent copy generation with auto-discovered research context and spam self-check.
InputsBrief (segments + EDPs), research context (auto-discovered from _manifest.yaml)
Output3-email sequences per segment, 4 variants (2 Braun + 2 campaign-copywriter), spam-checked
Use whenStandalone copy generation outside the pipeline. Inside the pipeline, Stage 7 runs this automatically.
List Building
+
discolike
natural language
Standalone lookalike company discovery from a seed domain.
InputsSeed domain (e.g. stripe.com)
OutputCSV of similar companies with domain, name, industry, employee count. Auto-chains through list-normalizer.
Use whenDefault list source for the pipeline. "Find companies like this one."
+
ai-ark-companies
natural language
Discover companies by industry, geography, and criteria via AI Ark search.
InputsIndustry, geography, company size, keywords
OutputNormalized CSV with _source column. Auto-chains through list-normalizer.
Use whenBuilding lists by industry/geo without a seed domain. Broader discovery than DiscoLike.
+
ai-ark-people
natural language
Find decision-maker contacts (owners, founders, VPs) at target companies.
InputsList of company domains
OutputContact records: name, title, email, LinkedIn URL. Powers Stage 4 in the pipeline.
Use whenFinding owner/founder/VP contacts at a list of companies. Standalone or as part of pipeline Stage 4.
+
google-maps-list-builder
natural language
Scrape Google Maps for local SMB lists by category and location.
InputsBusiness category + location (e.g. "dentists in Denver")
OutputCSV placed at stages/01-discover/raw.csv. Pipeline enters at Stage 2 (Normalize).
Use whenLocal SMB campaigns. Set list_source: google_maps in brief frontmatter.
+
apify-linkedin-jobs
natural language
Discover companies with active hiring signals. Hiring firm exclusion built in.
InputsJob title keywords, location, seniority filters
OutputCompanies hiring for specific roles. 3,716 staffing/recruiting firms auto-excluded. Optional Supabase persistence.
Use whenHiring intent = buying signal. "Companies hiring a Head of Marketing probably need marketing services."
+
apify-linkedin-ads
natural language
Companies running LinkedIn ads — keyword search via Ad Library scraper.
InputsLinkedIn Ad Library search URL (keywords, date range, geo)
OutputPer-company ad activity summary. Cross-reference with linkedin_jobs for dual-signal leads.
Use whenFinding companies with active ad spend. Ad text feeds copy research.
+
competitor-engagers
natural language
Build lists from people engaging with competitor LinkedIn posts.
InputsCompetitor LinkedIn company page URLs
OutputPeople who liked/commented on competitor content — warm leads already aware of the problem space.
Use whenCompetitors have active LinkedIn presence. These leads already care about the topic.
+
reddit-find-list-builder
natural language
Build company lists from Reddit buying-signal posts and discussions.
InputsSubreddit + keyword search terms
OutputCompanies mentioned in buying-signal posts. Builds on reddit-find's two-pass search.
Use whenICP hangs out on Reddit. "People asking for recommendations" = high-intent leads.
+
list-normalizer
natural language
Normalize any raw CSV to Clay-compatible pipeline format. MX validation + dedup.
InputsAny CSV with arbitrary column names
OutputStandard schema: domain, domain_slug, company_name, country, employees. MX-validated, titlecased, deduped.
Use whenPreparing raw lists from any source (GMaps, Apify, Clutch, custom exports) for pipeline or Clay enrichment.
Data + Enrichment
+
clay-cli
natural language
Full Clay CLI interface — 29 commands, 13 groups. Schema, tables, webhooks, enrichment, records, presets.
Groupsschema, tables, webhooks, enrichment, callbacks, records, export, usage, presets, pipeline, setup, polling, push
Use whenAny Clay.com table operations, enrichment pipeline setup, data management, or lead refill workflows.
+
clay-enrich
natural language
Tiered Clay enrichment orchestrator — batched concurrent API calls with JSONL streaming.
InputsCSV of rows to enrich
OutputJSONL results (append-only, resumable). Used between Clay export and ICP qualification inside list-pipeline.
Use whenNeed tier 1/2/3 enrichment fan-out. Discovers Clay APIs by tier automatically.
+
icp-prompt-builder
natural language
AI-powered ICP qualification prompt tuning + at-scale application.
Inputsicp-profile.yaml + sample leads for tuning
OutputTuned ICP qualification prompt registered in lg-llm-runtime
Use whenDefault ICP prompt isn't filtering well enough. Tune on real leads to improve Stage 3 accuracy.
Campaign Ops
+
bison
natural language
Standalone Bison campaign lifecycle — create, launch, refill, score replies.
OpsCreate campaigns, upload sequences, assign inboxes, upload leads, launch, refill, pause, score replies
Use whenManaging Bison campaigns outside the orchestrator pipeline. Direct campaign lifecycle control.
+
signature-management
/gtm:signatures
Bulk email signature management across Bison inboxes. CAN-SPAM compliant.
OpsList current sigs, apply templates with variable resolution, preview, dry-run, rollback
Use whenUpdating signatures across all inboxes. Physical address required (CAN-SPAM).
+
yolo-mode
/gtm:yolo
Auto-run pipeline skipping all checkpoints except Gate 9g. Hard launch gate always requires human.
SkipsEnrichment selection, segmentation tiebreak, copy selection, inbox selection, QA review, scorecard D-grade
KeepsGate 9g (human launch confirmation) — always requires operator sign-off
Use whenRepeat campaign with trusted brief. Experienced operator who wants speed over review.
+
cold-email-weekly-rhythm
natural language
Mon/Wed/Fri/biweekly/monthly/quarterly ops cadence for live campaigns.
CadenceMonday: review replies + score. Wednesday: refill lists. Friday: deliverability check. Biweekly: copy refresh. Monthly: strategy review.
Use whenFirst campaign is live. This is the ongoing operational discipline that separates top 1% from hobbyists.
+
deliverability-incident-response
natural language
Triage spam/bounce/blacklist incidents with structured diagnosis.
HandlesSpam folder placement, high bounce rates, blacklist detection, domain reputation drops
Use whenDeliverability metrics tank. Structured triage before panicking.
Quality + Testing
+
experiment-design
natural language
Design single-variable A/B tests pre- or post-launch.
Use whenTesting subject lines, CTAs, send times, or personalization approaches. One variable at a time.
+
personalization-subagent-pattern
natural language
Stage 7b dual-agent personalization operator guide and troubleshooting.
CoversBraun (prospect-voice) + campaign-copywriter (agency-voice) pattern, approval loop, budget gate, variable injection, company-domain caching
Use whenDebugging personalization quality, tuning the approval prompt, understanding the cost model.
Offer Engineering
+
3-offers-formalization
natural language
Formalize 3-tier offer package using the Hormozi value equation framework.
FrameworkDream outcome × perceived likelihood / time delay × effort. Three tiers: starter, core, premium.
Use whenStructuring the client's offer before campaign planning. Weak offers = low reply rates regardless of copy quality.
+
lead-magnet-brainstorm
natural language
10 archetypes scored on 4-criterion rubric. Outputs 5-10 concrete offer ideas.
CriteriaCheap to deliver, genuinely valuable, demonstrates competence, scalable
Use whenReply rates below 1%, CTAs feel weak, or ICP onboarding flagged a missing lead magnet.
+
content-backlog-wiring
natural language
Surface content atoms as copy ammunition during campaign planning.
InputsContent backlog (articles, frameworks, case studies, LinkedIn posts, blog drafts)
OutputContent Ammunition section keyed to campaign segments — existing content matched to ICP context
Use whenDuring campaign-strategy or campaign-copywriting. Use existing content instead of generating from scratch.

1:1 AI Copy System

The copy pipeline is a multi-agent system that generates, personalizes, and quality-checks every email before it reaches a real inbox. Here's how every piece connects.

Feature Flags

dual_agent_copy
Braun (prospect-voice) + campaign-copywriter (agency-voice) generate 4 variants per segment. Braun grounds on EDPs from the brief.
per_lead_personalization
Stage 7b generates 3 fields per lead: situation_line, value_line, cta_soft. Dual-agent pattern with 10-lead approval loop.
self_annealing_qa
Stage 8 anneal loop auto-detects spam words and rewrites copy via LLM until clean. Max iterations with operator fallback.
three_layer_spam_check
Cheapest-first: static word list (zero cost) → learned-spam-words.json DB (file I/O) → EmailGuard API (only if layers 1+2 clean).
rendered_semantic_qa
Resolves {{VARIABLES}} against real lead data, then runs graduated prompt to check if the email makes sense for that specific person.
lead_data_audit
Mechanical check: first_name/company_name populated, variable completeness across all 3 emails, HIGH severity blocks launch.
personalization_budget_gate
Brief frontmatter personalization_max_leads (default 500). Company-domain caching prevents cost explosion on repeat domains.
variable_format_conversion
Stage 8c deterministic pass: {{DOUBLE_BRACE}} in drafts → {SINGLE_BRACE_ALL_CAPS} at QA time (Bison-native format).

Copy Pipeline Flow

Brief EDPs Braun Agent
2 prospect-voice variants
Copywriter Agent
2 agency-voice variants
Operator Picks Winner Personalize
3 fields × N leads
Rendered QA
sample with real data
Anneal Loop
auto-fix spam
Mechanical QA
3-layer spam + vars + lead audit
Convert to Bison
{{VAR}} → {VAR}
final_copy.yaml

Development Roadmap

43 phases across 10 milestones. 22 days from first commit to v3.0.

v1.0
Full PipelineShipped
Phases 1-5 — Foundation, discovery-to-people, enrichment, segmentation, copy, QA, Bison launch, 3-email sequences. The complete brief-to-launch loop.
Apr 21
v1.1
Pipeline ExpansionShipped
Phases 6-9 — Waterfall email find, MX filter, per-lead personalization, Google Maps list source, reply scoring.
Apr 22
v1.2
Test HardeningShipped
Phase 17 — Eliminated 53 accumulated test failures. Schema versions, migration tests, multica pin, e2e CLI migration.
Apr 27
v1.3
Cost AttributionShipped
Phase 19 — row_keys retrofit across all LLM stages. Per-stage + grand-total token/cost tracking.
Apr 27
v1.4
Skills VerificationShipped
Phases 20-22 — Branch merge, YOLO pytest, skill verification (TDD), full-chain integration test.
Apr 30
v2.0
Intelligence + List BuildingShipped
Phases 23-26 — Deliverability + experiment design, scorecard enhancement, LinkedIn Jobs/Ads discovery, ICP prompt builder.
Apr 30
v2.1
Operations + DistributionShipped
Phases 27-31 — Offer engineering, personalization docs, campaign rhythm, Reddit-Find, content backlog wiring.
Apr 30
v2.2
Pipeline EfficiencyShipped
Phases 32-33 — MX utilities, pre-ICP domain filter (Stage 2.5), stage input validation, pipeline dashboard command.
May 4
v2.3
Operator VisibilityShipped
Phases 35-36 — Google Sheets lead hygiene tabs (7-tab structure), Next.js web dashboard on Vercel.
May 5
v3.0
Full GTM Operating SystemShipped
Phases 37-43 — Foundation utilities, ICP ingestion, stateful research chain, copy+QA system, list source skills, Bison management, documentation + routing.
May 10

Client Journey: End to End

Follow a new client from first conversation to live campaign with replies scoring. Every step shows what the operator does, what the system does, and what gets produced.

STEP 1

Client Onboarding

Operator runs: /gtm:icp-onboarding

The system interviews the operator about the client's business — who they sell to, deal size, verticals, title-level targeting, hard filters (geo, company size, exclusions). Optionally crawls the client's website via spider-waterfall to auto-extract ICP signals. Can also ingest existing CRM CSVs or call transcripts.

Three confirmation rounds refine each field with source attribution — "This came from your website's pricing page" vs "You said this in the interview."

Produces: icp-profile.yaml — the structured ICP consumed by every downstream skill.

STEP 2

Market Research

Operator runs: /gtm:research-chain

The 11-step FIND chain produces a Market Takeover Playbook. Steps include competitor landscape mapping, buyer-journey analysis, objection mining, pricing intelligence, channel analysis, and content gap identification. Each step writes a persistent artifact with SHA-256 hash — stale steps can be individually refreshed.

Optional: /gtm:voice-of-market mines Reddit for real prospect language — pain points, objections, buying triggers — in the buyer's own words. This feeds directly into copy angles.

Produces: research/<slug>-takeover-playbook.md + research/<slug>-playbook-structured.yaml

STEP 3

Campaign Strategy

Operator runs: /gtm:campaign-strategy

Consumes the ICP profile + structured playbook. Generates 15+ campaign ideas — each with a target segment, angle, hook, expected reply rate, and difficulty rating. The operator picks 1-3 to pursue.

Produces: campaign-strategy.yaml

STEP 4

Campaign Brief

Operator runs: /gtm:briefing

Synthesizes ICP + research + chosen strategy into a pipeline-ready brief. Contains required sections: Market, Segments, Personas, Angles, Rough Messaging, and EDP (Emotional Decision Points) per segment. Frontmatter specifies the seed domain, list source, enrichment preferences, and segmentation thresholds.

The brief is frozen at campaign init — immutable once the pipeline starts. Any change requires a new brief.

Produces: briefs/<campaign-slug>.md — the single input to the pipeline.

STEP 5

Pipeline Execution

Operator runs: gtm-orchestrator run --client acme --brief briefs/spring.md

The 15-stage pipeline fires. Stages 1-4 run fully automated — companies discovered, normalized, MX-filtered, ICP-qualified, contacts found. The operator's first touch point is Stage 5:

Checkpoint 1 — Enrichment Selection (Stage 5)

Pipeline pauses (exit 5). Operator opens checkpoint.json, picks enrichments (LinkedIn scrape, recent news, funding, etc.), then runs gtm-orchestrator resume. Clay and lg-llm-runtime sub-runners execute the selected enrichments.

Checkpoint 2 — Segmentation Tiebreak (Stage 6)

LLM assigns each lead to a segment. Leads below the confidence threshold land in tiebreak.csv. Operator assigns ambiguous leads manually, resumes. Each segment gets its own subcampaigns/<slug>/leads.csv.

Checkpoint 3 — Copy Selection (Stage 7)

Dual-agent copy runs: Braun (prospect-voice) writes 2 variants, campaign-copywriter writes 2 more. Operator opens selection.yaml, picks a winner per segment (or provides custom copy), resumes. Stage 7b then personalizes each lead with AI-generated situation_line, value_line, and cta_soft.

Checkpoint 4 — QA Review (Stage 8)

Rendered QA checks sample emails with real lead data. Self-annealing loop auto-fixes spam words. Mechanical checks catch variable syntax errors and lead-data quality issues. If clean, variables convert to Bison format automatically. If not, operator reviews qa_findings.yaml.

Checkpoint 5 — Scorecard (Stage 85)

List quality scored on 8 dimensions. Grade C+ proceeds automatically. Grade D pauses for review. Grade F hard-blocks — the list isn't ready.

Produces: final_copy.yaml — Bison-ready copy in single-brace format, per-segment lead CSVs, full cost breakdown.

STEP 6

Bison Launch

Stage 9 runs 7 substages automatically: creates one Bison campaign per segment, uploads the 3-email sequence with custom variables, lists connected inboxes for operator selection (checkpoint), uploads leads in 500-lead batches, routes leads to campaigns, and verifies campaign settings match standards.

Then the hard gate: launch_confirmation.yaml presents a full pre-launch summary — segment counts, inbox assignments, sequence preview, settings verification. The operator must set operator_confirms: true and sign their name. There is no auto-launch pathway.

Produces: Live Bison campaigns — one per segment, sending 3-email sequences with per-lead personalization.

STEP 7

Replies + Retrospective

Operator runs: gtm-orchestrator score-replies <campaign_dir>

Reply classifier scores incoming replies into 9 categories (interested, meeting-booked, objection, not-now, wrong-person, unsubscribe, auto-reply, negative, other) using a graduated prompt. SHA-256 dedup prevents double-scoring.

Retrospective engine writes outcomes.md with per-segment breakdown: reply rate, interest rate, meeting rate, and comparison against the 1% baseline. Feeds learnings back into the next campaign's research and strategy.

Produces: outcomes.md — segment performance breakdown, what worked, what to change.

What the client folder looks like after

clients/gtm-client-acme/
  icp-profile.yaml ← Step 1
  research/acme-takeover-playbook.md ← Step 2
  campaign-strategy.yaml ← Step 3
  briefs/spring-outbound.md ← Step 4 (frozen)
  campaigns/spring-outbound/ ← Steps 5-7
    campaign.db ← SQLite state (truth)
    stages/
      01-discover/  02-normalize/  03-qualify/
      04-people/  05-enrich/  06-segment/
      07-copy/  08-qa/  09-launch/
    subcampaigns/
      saas-founders/leads.csv
      agency-owners/leads.csv
    outcomes.md ← Step 7

Commands + Exit Codes

Commands

run <campaign_dir> — start or resume
run --dry-run — simulate Bison calls
resume <campaign_dir> — after checkpoint edit
status <campaign_dir> — per-stage costs
score-replies <campaign_dir> — post-launch

Exit Codes

0 — Success
5 — CheckpointPending (edit + resume)
6 — StandardsVerificationFailed
7 — Scorecard hard-block (grade F)