@sellable/mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/.claude-plugin/plugin.json +12 -0
  2. package/.mcp.json +9 -0
  3. package/README.md +355 -0
  4. package/dist/api.d.ts +21 -0
  5. package/dist/api.js +73 -0
  6. package/dist/auth.d.ts +60 -0
  7. package/dist/auth.js +246 -0
  8. package/dist/engage-memory.d.ts +63 -0
  9. package/dist/engage-memory.js +354 -0
  10. package/dist/index-dev.d.ts +2 -0
  11. package/dist/index-dev.js +17 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +8 -0
  14. package/dist/server.d.ts +1 -0
  15. package/dist/server.js +499 -0
  16. package/dist/skills.d.ts +11 -0
  17. package/dist/skills.js +97 -0
  18. package/dist/tools/auth.d.ts +30 -0
  19. package/dist/tools/auth.js +124 -0
  20. package/dist/tools/blueprint-commit.d.ts +174 -0
  21. package/dist/tools/blueprint-commit.js +286 -0
  22. package/dist/tools/bootstrap.d.ts +64 -0
  23. package/dist/tools/bootstrap.js +246 -0
  24. package/dist/tools/campaigns.d.ts +589 -0
  25. package/dist/tools/campaigns.js +892 -0
  26. package/dist/tools/cells.d.ts +58 -0
  27. package/dist/tools/cells.js +48 -0
  28. package/dist/tools/context.d.ts +88 -0
  29. package/dist/tools/context.js +271 -0
  30. package/dist/tools/csv-domains.d.ts +73 -0
  31. package/dist/tools/csv-domains.js +464 -0
  32. package/dist/tools/csv-linkedin.d.ts +102 -0
  33. package/dist/tools/csv-linkedin.js +712 -0
  34. package/dist/tools/direct-campaigns.d.ts +240 -0
  35. package/dist/tools/direct-campaigns.js +250 -0
  36. package/dist/tools/engage-bootstrap.d.ts +94 -0
  37. package/dist/tools/engage-bootstrap.js +205 -0
  38. package/dist/tools/engage-discovery.d.ts +78 -0
  39. package/dist/tools/engage-discovery.js +150 -0
  40. package/dist/tools/engage-memory.d.ts +181 -0
  41. package/dist/tools/engage-memory.js +143 -0
  42. package/dist/tools/engage-state.d.ts +72 -0
  43. package/dist/tools/engage-state.js +62 -0
  44. package/dist/tools/enrichment.d.ts +167 -0
  45. package/dist/tools/enrichment.js +174 -0
  46. package/dist/tools/flow-preflight.d.ts +68 -0
  47. package/dist/tools/flow-preflight.js +138 -0
  48. package/dist/tools/framework.d.ts +44 -0
  49. package/dist/tools/framework.js +153 -0
  50. package/dist/tools/interaction-mode.d.ts +27 -0
  51. package/dist/tools/interaction-mode.js +102 -0
  52. package/dist/tools/leads.d.ts +2417 -0
  53. package/dist/tools/leads.js +2307 -0
  54. package/dist/tools/linkedin.d.ts +210 -0
  55. package/dist/tools/linkedin.js +229 -0
  56. package/dist/tools/navigation.d.ts +91 -0
  57. package/dist/tools/navigation.js +381 -0
  58. package/dist/tools/one-off.d.ts +229 -0
  59. package/dist/tools/one-off.js +273 -0
  60. package/dist/tools/processing.d.ts +70 -0
  61. package/dist/tools/processing.js +56 -0
  62. package/dist/tools/prompts.d.ts +211 -0
  63. package/dist/tools/prompts.js +210 -0
  64. package/dist/tools/provider-preflight.d.ts +21 -0
  65. package/dist/tools/provider-preflight.js +59 -0
  66. package/dist/tools/readiness.d.ts +261 -0
  67. package/dist/tools/readiness.js +510 -0
  68. package/dist/tools/rows.d.ts +126 -0
  69. package/dist/tools/rows.js +105 -0
  70. package/dist/tools/rubrics.d.ts +497 -0
  71. package/dist/tools/rubrics.js +681 -0
  72. package/dist/tools/senders.d.ts +44 -0
  73. package/dist/tools/senders.js +69 -0
  74. package/dist/tools/sequencer.d.ts +127 -0
  75. package/dist/tools/sequencer.js +194 -0
  76. package/dist/tools/tables.d.ts +35 -0
  77. package/dist/tools/tables.js +36 -0
  78. package/dist/tools/verify-row.d.ts +36 -0
  79. package/dist/tools/verify-row.js +38 -0
  80. package/dist/tools/workspaces.d.ts +140 -0
  81. package/dist/tools/workspaces.js +139 -0
  82. package/dist/utils/workspace-root.d.ts +1 -0
  83. package/dist/utils/workspace-root.js +39 -0
  84. package/package.json +46 -0
  85. package/skills/building-gtm-tables/SKILL.md +216 -0
  86. package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
  87. package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
  88. package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
  89. package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
  90. package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
  91. package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
  92. package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
  93. package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
  94. package/skills/building-gtm-tables/references/verify-loop.md +74 -0
  95. package/skills/campaign-messages/SKILL.md +173 -0
  96. package/skills/campaign-messages/flow.v1.json +75 -0
  97. package/skills/craft-message/SKILL.md +401 -0
  98. package/skills/create-campaign/ARCHITECTURE.md +232 -0
  99. package/skills/create-campaign/DISCUSS.md +296 -0
  100. package/skills/create-campaign/FLOW_ASCII.md +240 -0
  101. package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
  102. package/skills/create-campaign/README.md +142 -0
  103. package/skills/create-campaign/SKILL.md +286 -0
  104. package/skills/create-campaign/context/README.md +67 -0
  105. package/skills/create-campaign/context/_TEMPLATE.md +12 -0
  106. package/skills/create-campaign/context/context.md +35 -0
  107. package/skills/create-campaign/context/learnings.md +16 -0
  108. package/skills/create-campaign/context/registry.json +19 -0
  109. package/skills/create-campaign/core/flow.v1.json +217 -0
  110. package/skills/create-campaign/core/policy.md +191 -0
  111. package/skills/create-campaign/core/providers/apollo.json +35 -0
  112. package/skills/create-campaign/core/providers/prospeo.json +34 -0
  113. package/skills/create-campaign/core/providers/registry.json +31 -0
  114. package/skills/create-campaign/core/providers/sales-nav.json +37 -0
  115. package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
  116. package/skills/create-campaign/references/brief-template.md +64 -0
  117. package/skills/create-campaign/references/campaign-quality.md +84 -0
  118. package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
  119. package/skills/create-campaign/references/offer-patterns.md +108 -0
  120. package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
  121. package/skills/create-campaign/references/question-examples.md +167 -0
  122. package/skills/create-campaign/references/token-fill-examples.md +81 -0
  123. package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
  124. package/skills/create-campaign-brief/DISCUSS.md +64 -0
  125. package/skills/create-campaign-brief/README.md +176 -0
  126. package/skills/create-campaign-brief/SKILL.md +537 -0
  127. package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
  128. package/skills/create-campaign-brief/references/brief-template.md +220 -0
  129. package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
  130. package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
  131. package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
  132. package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
  133. package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
  134. package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
  135. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
  136. package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
  137. package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
  138. package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
  139. package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
  140. package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
  141. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
  142. package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
  143. package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
  144. package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
  145. package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
  146. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
  147. package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
  148. package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
  149. package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
  150. package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
  151. package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
  152. package/skills/create-campaign-v2/SKILL.md +1619 -0
  153. package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
  154. package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
  155. package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
  156. package/skills/create-campaign-v2/core/policy.md +82 -0
  157. package/skills/create-campaign-v2/references/ai-tells.md +253 -0
  158. package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
  159. package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
  160. package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
  161. package/skills/create-campaign-v2/references/filter-leads.md +495 -0
  162. package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
  163. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
  164. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
  165. package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
  166. package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
  167. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
  168. package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
  169. package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
  170. package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
  171. package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
  172. package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
  173. package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
  174. package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
  175. package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
  176. package/skills/create-campaign-v2-validation/SKILL.md +296 -0
  177. package/skills/create-post/SKILL.md +1308 -0
  178. package/skills/create-rubric/SKILL.md +251 -0
  179. package/skills/engage/SKILL.md +549 -0
  180. package/skills/engage/core/README.md +23 -0
  181. package/skills/engage/core/proven-searches.json +11 -0
  182. package/skills/engage/core/style-guide.template.md +47 -0
  183. package/skills/engage/core/tracked-people.json +10 -0
  184. package/skills/enrich-prospects/SKILL.md +97 -0
  185. package/skills/find-leads/SKILL.md +467 -0
  186. package/skills/generate-messages/SKILL.md +2361 -0
  187. package/skills/interview/SKILL.md +132 -0
  188. package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
  189. package/skills/interview/core/ICP.template.md +54 -0
  190. package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
  191. package/skills/providers/apollo.md +520 -0
  192. package/skills/providers/prospeo.md +398 -0
  193. package/skills/providers/sales-nav.md +372 -0
  194. package/skills/providers/signal-discovery.md +495 -0
  195. package/skills/research/SKILL.md +258 -0
  196. package/skills/research/config.json +9 -0
  197. package/skills/research/override.md +13 -0
  198. package/skills/research-prospect/SKILL.md +99 -0
  199. package/skills/research-sender/SKILL.md +158 -0
  200. package/skills/workflow-sequences/SKILL.md +85 -0
@@ -0,0 +1,97 @@
1
+ ---
2
+ name: enrich-prospects
3
+ description: Research prospects or clients using parallel sonnet subagents. Returns structured enrichment for personalization.
4
+ visibility: internal
5
+ ---
6
+
7
+ # Enrich Prospects
8
+
9
+ <role>
10
+ You are a research coordinator that spawns sonnet agents to gather prospect intelligence in parallel. Your job is to orchestrate the research and synthesize results into actionable hooks for outreach.
11
+ </role>
12
+
13
+ <objective>
14
+ Enrich one or more prospects with:
15
+ 1. LinkedIn profile context (role, experience, company)
16
+ 2. Recent posts analysis (themes, engagement, hooks)
17
+ 3. Company research (news, case studies, differentiators)
18
+ 4. Synthesized enrichment notes for personalization
19
+
20
+ **Output:** Structured enrichment notes ready for message generation.
21
+ </objective>
22
+
23
+ <tools>
24
+
25
+ ## Direct Tools (Main Context)
26
+
27
+ - `mcp__sellable__get_linkedin_profile` - Fetch LinkedIn profile (use first to get basic info)
28
+ - `mcp__sellable__get_rows` - Get prospect data from campaign table
29
+ - `mcp__sellable__get_subskill_prompt` - Load shared research protocol
30
+
31
+ ## Subagent Research (Sonnet - parallel)
32
+
33
+ - `Task` with `model="sonnet-4.5"` - Spawn research agents
34
+ - Subagents can use: `get_user_posts`, `WebSearch`, `WebFetch`
35
+
36
+ </tools>
37
+
38
+ <shared_protocol>
39
+
40
+ This skill uses dedicated research subskills:
41
+
42
+ - `mcp/sellable/skills/research-prospect/SKILL.md`
43
+ - `mcp/sellable/skills/research-sender/SKILL.md`
44
+
45
+ Before starting, choose one:
46
+
47
+ - Prospect/lead enrichment:
48
+ - `get_subskill_prompt({ subskillName: "research-prospect" })`
49
+ - Client/sender enrichment:
50
+ - `get_subskill_prompt({ subskillName: "research-sender" })`
51
+
52
+ Then follow the selected subskill directly.
53
+ If the prospect/client data includes a company LinkedIn URL, pass it as `companyLinkedinUrl`.
54
+
55
+ Override rules:
56
+
57
+ 1. If the user provides custom research instructions, follow them.
58
+ 2. If `mcp/sellable/skills/research/override.md` exists, follow it.
59
+
60
+ </shared_protocol>
61
+
62
+ <critical_rules>
63
+
64
+ ## Critical Rules
65
+
66
+ 1. **Always use sonnet-4.5 for research agents** - Keeps costs low, runs fast
67
+ 2. **Run agents in parallel** - Send all Task calls in one message
68
+ 3. **Limit to 10 posts** - More than enough for pattern detection
69
+ 4. **150 words max per agent** - Forces concise, actionable output
70
+ 5. **Exact format responses** - Makes synthesis predictable
71
+ 6. **No hallucinated quotes** - Only use actual content from posts
72
+ 7. **Handle missing data** - Say "None found" not make things up
73
+ 8. **Batch large lists** - Max 3 prospects in parallel at once
74
+
75
+ </critical_rules>
76
+
77
+ <usage>
78
+
79
+ ## How Other Skills Use This
80
+
81
+ ### From create-campaign (client enrichment):
82
+
83
+ ```
84
+ /sellable:enrich-prospects with client's LinkedIn URL
85
+ → Returns: Client positioning, post themes, company context
86
+ → Used to: Generate smart defaults for onboarding questions
87
+ ```
88
+
89
+ ### From generate-messages (prospect enrichment):
90
+
91
+ ```
92
+ /sellable:enrich-prospects with prospect LinkedIn URLs
93
+ → Returns: Hooks, pain points, conversation starters
94
+ → Used to: Craft personalized opening lines
95
+ ```
96
+
97
+ </usage>
@@ -0,0 +1,467 @@
1
+ ---
2
+ name: find-leads
3
+ description: Lead-strategy orchestrator for new Sellable campaigns. Turns kickoff context into a kickoff doc, feasibility check, progressive discovery plan, and selective deep-exploration recommendation.
4
+ visibility: internal
5
+ ---
6
+
7
+ # Find Leads
8
+
9
+ You own lead sourcing strategy for new Sellable campaigns.
10
+ This subskill is a kickoff-doc builder first, a provider-discovery orchestrator second.
11
+ Narrate progress briefly, write findings into the kickoff doc as you go, and stop at the explicit approval gates.
12
+
13
+ ## Scope Boundary
14
+
15
+ In scope:
16
+
17
+ - WHO to target
18
+ - WHY NOW signals
19
+ - sender LinkedIn access and provider readiness
20
+ - DIRECT / PROXIED / UNSUPPORTED feasibility mapping
21
+ - progressive discovery and explorer recommendations
22
+ - kickoff doc creation and final lead strategy
23
+
24
+ Out of scope:
25
+
26
+ - offer framing
27
+ - messaging drafts
28
+ - voice calibration
29
+ - DNC / calendar logistics
30
+ - campaign launch or lead import confirmation
31
+
32
+ Leave out-of-scope topics in `## Deferred to Create Campaign`.
33
+
34
+ ## Required Inputs
35
+
36
+ Use as many of these as are available. Use `Unknown` rather than inventing facts.
37
+
38
+ - client legal entity and product / brand name
39
+ - sender LinkedIn URL(s)
40
+ - existing ICP doc / persona sheet / targeting list
41
+ - optional kickoff transcript or notes
42
+ - optional draft campaign context from the caller
43
+
44
+ If a transcript is provided, mine it before asking live questions.
45
+
46
+ ## Shared Artifact
47
+
48
+ Create or update:
49
+
50
+ `./.sellable/gtm-kickoffs/{client-slug}-{date}.md`
51
+
52
+ Minimum sections:
53
+
54
+ - `Status`
55
+ - `Client Identity`
56
+ - `Sender Access`
57
+ - `Source Material`
58
+ - `ICP Draft`
59
+ - `Feasibility Check`
60
+ - `Progressive Discovery Notes`
61
+ - `Lead Strategy`
62
+ - `Deferred to Create Campaign`
63
+
64
+ The kickoff doc is the resume surface. Re-open it before repeating discovery work.
65
+
66
+ ## Execution Backend Routing
67
+
68
+ - If `Task` is available, deep exploration uses the file-backed explorer agents:
69
+ - `./.claude/agents/lead-explorer-signals.md`
70
+ - `./.claude/agents/lead-explorer-sales-nav.md`
71
+ - `./.claude/agents/lead-explorer-prospeo.md`
72
+ - Else if `multi_tool_use.parallel` is available, run independent discovery calls in parallel and synthesize locally.
73
+ - Else run sequentially.
74
+ - Never claim agents were used when they were not.
75
+
76
+ ## Core Tools
77
+
78
+ - `mcp__sellable__enrich_sender`
79
+ - `mcp__sellable__get_provider_prompt`
80
+ - `mcp__sellable__search_signals`
81
+ - `mcp__sellable__fetch_post_engagers`
82
+ - `mcp__sellable__lookup_sales_nav_filter`
83
+ - `mcp__sellable__search_sales_nav`
84
+ - `mcp__sellable__search_prospeo`
85
+ - `mcp__sellable__load_csv_domains`
86
+ - `mcp__sellable__load_csv_linkedin_leads`
87
+ - host-native question flow / AskUserQuestion
88
+ - host-native local-file read/search tools when transcript or kickoff docs are on disk
89
+
90
+ ## Operating Rules
91
+
92
+ - Do not hallucinate customer proof, ICP filters, or sender readiness.
93
+ - Do not infer sender identities from meeting attendance alone. Only treat someone as a sender when the source material explicitly identifies them as a sender or supplies their LinkedIn URL.
94
+ - Do not ask Layer 1 questions already answered by a transcript, ICP doc, or Layer 0 research.
95
+ - Do not include Apollo in the explorer set for this phase.
96
+ - Do not move to deep exploration until Gate 0 is approved.
97
+ - Do not finalize `## Lead Strategy` until Gate 2 is approved.
98
+ - Provider choice must be intent-relative and evidence-relative.
99
+ - Default source order for reply-likelihood-first outbound is `Signals -> Sales Nav -> Prospeo` unless the ask explicitly points elsewhere.
100
+ - If the user is explicit about the goal, route from that goal first.
101
+ - If the user is not explicit, infer the first hypothesis from the brief, then validate it with sample probes before recommending a lane.
102
+ - When enough context exists, try 1-2 alternate hypotheses if the first lane is too weak or noisy.
103
+ - Directional preview does not require a sender, campaign, or selected lead list. Start with count/sample exploration first; only attach searches to a campaign when the user is ready to import.
104
+ - If the user already has a LinkedIn-profile CSV, treat that as a direct lead-list path and skip discovery.
105
+
106
+ Execution flow:
107
+
108
+ 1. Confirm lead source with the user.
109
+ 2. If the user has a CSV of LinkedIn profile URLs on disk, call `load_csv_linkedin_leads` first.
110
+ - Preview, confirm, then review the resulting lead list before `confirm_lead_list`.
111
+ - Confirmed execution uploads the raw CSV file, starts the server-owned import job, and waits on lead-list readiness before returning.
112
+ - This path creates/appends a real lead list directly and does not use provider search/import jobs.
113
+ 3. If the user has a CSV of company domains on disk, call `load_csv_domains` first.
114
+ - Use the returned `domainFilterId` in a provider search, then continue with `import_leads`.
115
+ 4. Otherwise run the appropriate search tool and collect a `searchId` if relevant.
116
+ 5. Call `import_leads` with:
117
+ - `campaignOfferId`
118
+ - `currentStep`
119
+ - `sourceLeadListId` OR `searchId`
120
+ 6. Call `wait_for_lead_list_ready` only for provider-imported lead lists (pass jobId/targetLeadCount from `import_leads` if available).
121
+ 7. Ask the user to review and confirm the list looks good.
122
+ 8. When the user confirms, call `confirm_lead_list` with:
123
+ - `campaignOfferId`
124
+ - `sourceLeadListId` (or omit to use `selectedLeadListId`)
125
+ - `jobId` (from `import_leads` when available; omit for direct CSV lead lists)
126
+ - `targetLeadCount` (from `import_leads` when available)
127
+ 9. For campaign-builder flows, run post-confirm routing in this order:
128
+ - `update_campaign({ campaignId, currentStep: "filter-choice" })`
129
+ - `wait_for_campaign_table_ready({ campaignId })`
130
+ - `get_campaign_context({ campaignId, refresh: true })`
131
+ - `get_rows_minimal({ tableId: workflowTableId, limit: 10, page: 1 })`
132
+ 10. Report campaign table results.
133
+
134
+ ## Layer 0: Pre-research intake
135
+
136
+ 1. Confirm client identity: legal entity plus product / brand name.
137
+ 2. Confirm sender LinkedIn URL(s).
138
+ 3. Ask for any existing ICP doc, persona sheet, or targeting list.
139
+ 4. If a transcript or kickoff notes are available, extract WHO, WHY NOW, signals, exclusions, and sender-access facts before asking more questions.
140
+ 5. If no strong ICP doc exists, run `enrich_sender` for the sender URL(s) and collect company context from the sender / company snapshot.
141
+ 6. Draft a first-pass ICP hypothesis inside the kickoff doc.
142
+ 7. Present the draft with a lightweight correction gate:
143
+ - `close enough`
144
+ - `needs tweaks`
145
+ - `start over`
146
+ 8. Route:
147
+ - `close enough` -> skip most of Layer 1
148
+ - `needs tweaks` -> ask only the weak sections
149
+ - `start over` -> run full Layer 1
150
+
151
+ ## Layer 1: Trimmed interview (max 9 questions)
152
+
153
+ Use only the questions still missing after Layer 0.
154
+
155
+ ### Block A: WHO
156
+
157
+ 1. Primary persona + decision layers
158
+ 2. Company shape: industry, size, geography
159
+ 3. Exclusions: competitors, partners, over- / under-senior titles, DNC sources
160
+ 4. Ten-minute rubric: what makes a lead a `yes` or `no`
161
+
162
+ ### Block B: WHY NOW
163
+
164
+ 5. Pain or urgency trigger
165
+ 6. Signals that indicate active need now
166
+ 7. ABM list or named-account bias
167
+ 8. Competitor / adjacent-tool presence worth using as a proxy
168
+
169
+ ### Block C: Sender access
170
+
171
+ 9. Sender LinkedIn access and provider readiness (Sales Nav state, domain lists, LinkedIn URL CSVs)
172
+
173
+ For each answer, mark one of:
174
+
175
+ - `confident`
176
+ - `guess`
177
+ - `missing`
178
+
179
+ ## Layer 1.5: Feasibility Check
180
+
181
+ Before discovery, classify each ask as:
182
+
183
+ - `DIRECT` = at least one provider supports it natively
184
+ - `PROXIED` = only achievable through a weaker proxy
185
+ - `UNSUPPORTED` = no provider can satisfy it reliably
186
+
187
+ Write the result into `## Feasibility Check`.
188
+
189
+ ### Provider Capability Matrix
190
+
191
+ | Need | Signals | Sales Nav | Prospeo | Notes |
192
+ | ----------------------------------------- | ----------- | ---------------------------- | ----------- | ----------------------------------------------------------------------------------- |
193
+ | Recent behavioral intent | DIRECT | PROXIED via activity filters | UNSUPPORTED | Signals is the true behavior-first path |
194
+ | Posted recently on LinkedIn | PROXIED | DIRECT | UNSUPPORTED | Sales Nav `POSTED_ON_LINKEDIN` is the canonical proxy |
195
+ | Tight title + seniority + company filters | PROXIED | DIRECT | DIRECT | Sales Nav wins for live activity, Prospeo wins for broad verified-contact expansion |
196
+ | Named-account or domain-list targeting | UNSUPPORTED | PROXIED | DIRECT | Build a domain filter before `search_prospeo` |
197
+ | Broad persona expansion | PROXIED | PROXIED | DIRECT | Prospeo replaces Apollo for this phase |
198
+ | LinkedIn profile CSV on disk | DIRECT | UNSUPPORTED | UNSUPPORTED | Use `load_csv_linkedin_leads` as the direct path, skip provider discovery |
199
+ | Existing Sellable lead list | DIRECT | DIRECT | DIRECT | Sample existing rows; do not re-source or pretend the list was discovered in-run |
200
+
201
+ ### Gate 0
202
+
203
+ Stop and ask:
204
+
205
+ - which threads should be pulled first
206
+ - which asks require proxies
207
+ - which asks are unsupported
208
+
209
+ Proceed only after approval.
210
+
211
+ ## Layer 2: Hypothesis-driven progressive discovery
212
+
213
+ Run light-touch discovery before deep dispatch.
214
+
215
+ ### Step 1: Choose the first hypothesis from intent
216
+
217
+ Pick the first lane from the ask, not from a fixed default:
218
+
219
+ - explicit goal = "reach out to people most likely to reply" or similar, and the TAM plausibly uses LinkedIn -> start with `Signals`, then fall back to `Sales Nav`, then `Prospeo`
220
+ - explicit competitor engagers, topic engagers, community leaders, or conversation participants -> start with `Signals`
221
+ - explicit active practitioners, recently active LinkedIn users, recently changed jobs, or tight role/company filters -> start with `Sales Nav`
222
+ - explicit ABM/domain targeting, hiring-led targeting, or broad verified-contact expansion -> start with `Prospeo`
223
+ - no explicit routing -> infer the most plausible first lane from the brief and why-now context
224
+
225
+ ### Step 2: Validate the first hypothesis with sample probes
226
+
227
+ Use the existing provider tools to run a small, directional probe:
228
+
229
+ - capture counts
230
+ - inspect first-page / top samples
231
+ - note false positives
232
+ - keep only one plain-English search link label when available, such as `Search link I'd use:`, so the user can open the recommended search directly; describe discarded searches in prose without additional links and avoid internal phrases like `chosen lane`
233
+ - decide whether the lane looks viable
234
+ - For function-specific lanes, do not trust generic seniority labels (`Head`, `Director`, `VP`) by themselves. Pair them with explicit function keywords in `person_job_title`, then inspect the sample for `Head of X` leakage before widening.
235
+
236
+ If the first probe is weak or noisy and enough context exists, try 1-2 alternate hypotheses before returning.
237
+ If the first probe has good quality but insufficient scale, iterate 1-2 times to widen intelligently before returning.
238
+
239
+ Treat refinement as a measured loop:
240
+
241
+ 1. start with a reasonable baseline
242
+ 2. judge quality and projected scale
243
+ 3. if quality is weak, tighten
244
+ 4. if quality is good but scale is below threshold, widen
245
+ 5. keep the best recipe found and explain why it won
246
+
247
+ ### Provider playbooks
248
+
249
+ #### `Signals`
250
+
251
+ Use first when the value is in conversation opportunity, competitor engagers, community participants, or visible why-now behavior.
252
+
253
+ - For reply-likelihood-first outbound, Signals is the preferred first pass whenever the TAM plausibly posts, comments, or engages on LinkedIn.
254
+ - Treat Signals as the highest-upside source for first-send quality because active posters and engagers usually reply at materially higher rates than the cold full-TAM pool.
255
+ - The downside is scale and activeness: there may not be enough fresh posts, enough ICP-fit engagers, or enough TAM activity on LinkedIn to sustain the campaign. Measure that directly before committing.
256
+
257
+ - Treat Signals inside `find-leads` as a spot check for lane viability, not a full discovery project.
258
+ - Prefer 2 strong hypotheses over broad search spam.
259
+ - Start with one batch of 5 keywords or equivalent competitor/community probes.
260
+ - If the first batch is ambiguous but still promising, run one second batch of 5 new keywords.
261
+ - Stop after that spot check unless the user explicitly wants deeper Signals work.
262
+ - Favor ICP-fit conversation density over raw post volume.
263
+ - Capture counts, false-positive patterns, and notable examples.
264
+ - If Signals is materially in the running, do not stop at post-level quality alone.
265
+ - Pick 1-2 promising posts, then call `fetch_post_engagers` on those posts.
266
+ - Sample a representative first page only, scoring the first 25-40 engagers across the chosen posts against a rough yes/no headline rubric or `headlineICPCriteria`.
267
+ - Use headline and display-name cues only for the spot-check sample; do not enrich people during this phase.
268
+ - Base `estimatedReachableLeads` on the sampled engager pass rate, not only on a guessed discount from post themes.
269
+ - If you cannot fetch engagers in the current runtime, say the estimate is inferred and lower confidence.
270
+ - If Signals is too sparse, too noisy, or clearly below campaign scale after the spot check, fall back to `Sales Nav` rather than forcing a weak conversation-led lane.
271
+
272
+ #### `Sales Nav`
273
+
274
+ Use first when LinkedIn activity plus tighter role / company filters matter.
275
+
276
+ - Always call `lookup_sales_nav_filter` before dynamic filters.
277
+ - Start with a broad-but-reasonable baseline: company size + core roles + core industries.
278
+ - For reply-likelihood-first outbound, Sales Nav is the second choice after Signals: use it when the TAM is not active enough on LinkedIn, when Signals cannot sustain enough good fits, or when the targeting thesis depends on tighter role/company control than Signals can provide.
279
+ - For InMail or LinkedIn-send motions, establish the baseline TAM first, then test a `POSTED_ON_LINKEDIN` slice when the pool can still sustain a campaign.
280
+ - Treat recent posters as a preferred first-send slice, not just a nice-to-have proxy. When the recently-posted slice still yields enough projected good fits, prefer it because reply / acceptance performance is usually materially better than the cold full-TAM pool.
281
+ - When explaining a LinkedIn source decision, make the buying logic obvious:
282
+ pick people who are both good fits and likely to reply. Compare source paths
283
+ by expected volume, likely connection acceptance, likely reply rate, signal
284
+ quality, and tradeoffs. Use sample-backed or historical numbers when
285
+ available; otherwise label ranges as directional.
286
+ - Use these rough planning bands only as directional defaults when better
287
+ workspace/founder data is not available: Signals/recent engagers = lower
288
+ volume, higher reply upside; Sales Nav with recent LinkedIn activity = medium
289
+ volume and stronger acceptance/reply odds; broad Sales Nav = higher volume
290
+ with weaker reply odds; Prospeo/domain expansion = scale/account coverage but
291
+ usually weaker LinkedIn reply odds unless paired with strong signals.
292
+ - If the recently-posted slice becomes too small, remove the `POSTED_ON_LINKEDIN` filter and continue refining the non-posted baseline with the other role / company / industry filters.
293
+ - When you fall back from the recently-posted slice, say clearly that the posted filter was tested, explain why it was dropped, and keep the best non-posted lane as the source of truth.
294
+ - Use `RECENTLY_CHANGED_JOBS` when job-change activity is part of the targeting thesis.
295
+ - If quality is poor, tighten the lane with role, industry, seniority, geography, or activity filters.
296
+ - If quality is good but scale is too small, widen the lane by adding/removing roles, expanding industries, widening headcount bands, or relaxing activity constraints.
297
+ - Use as many smart refinement steps as needed within the remaining probe budget instead of returning the first under-scaled recipe.
298
+ - If the lane is meant to support scalable outbound, do not stop at a merely borderline workable result when obvious expansion steps remain.
299
+ - If you can name a specific next Sales Nav refinement that is still allowed by the probe budget, execute it before returning instead of listing it only as a recommendation.
300
+ - Only leave an obvious next Sales Nav refinement unexecuted when you already hit the search cap, the tool/runtime blocked it, or the previous refinement already showed quality breaking down.
301
+ - Keep widening until the lane is clearly scalable, quality breaks down, or no reasonable expansion remains.
302
+ - Stop when the lane is clearly scalable, clearly exhausted, or no longer improves.
303
+
304
+ #### `Prospeo`
305
+
306
+ Use first for broad persona expansion, ABM/domain targeting, hiring-led targeting, or scale once the lane is known.
307
+
308
+ - Never pass raw domains to `search_prospeo`.
309
+ - Create a `domainFilterId` first.
310
+ - Use Prospeo instead of Apollo for broad verified-contact expansion.
311
+ - For reply-likelihood-first outbound, Prospeo is the fallback path after Signals and Sales Nav. Use it when LinkedIn-native sources cannot produce enough good fits, when the TAM is not active enough on LinkedIn, or when domain/account expansion is the clearest remaining move.
312
+ - Start with the most likely person + company baseline for the ask.
313
+ - For security, AppSec, SOC, RevOps, Demand Gen, and similar function-specific lanes, prefer explicit function-title anchors first (`Head of Security`, `Director of Security Operations`, `VP of Demand Gen`) instead of generic seniority plus a department guess.
314
+ - If you widen with seniority labels such as `Head` or `Director`, keep a matching department/function constraint and inspect the sample for off-function leakage such as `Head of Social Media`, `Head of IT`, or `Director of Finance`.
315
+ - If quality is poor, tighten titles, company shape, seniority, geography, or hiring filters.
316
+ - If quality is good but scale is too small, widen titles, industries, company-size bands, or account scope.
317
+ - When ABM/domain targeting exists, prefer refining around the account set before broadening away from it.
318
+ - Use as many smart refinement steps as needed within the remaining probe budget instead of returning the first under-scaled recipe.
319
+ - If the lane is meant to support scalable outbound, do not stop at a merely borderline workable result when obvious expansion steps remain.
320
+ - If you can name a specific next Prospeo refinement that is still allowed by the probe budget, execute it before returning instead of listing it only as a recommendation.
321
+ - Only leave an obvious next Prospeo refinement unexecuted when you already hit the search cap, the tool/runtime blocked it, or the previous refinement already showed quality breaking down.
322
+ - Keep widening until the lane is clearly scalable, quality breaks down, or no reasonable expansion remains.
323
+ - Stop when the lane is clearly scalable, clearly exhausted, or no longer improves.
324
+
325
+ Document for each tested path:
326
+
327
+ - why it was chosen
328
+ - what was tested
329
+ - rough TAM / result quality
330
+ - sample size used for quality estimation
331
+ - sampled pass rate for the rough ICP rubric when available
332
+ - `sampledCount` when a lane used a sampled people review
333
+ - `passCount` when a lane used a sampled people review
334
+ - `passRate` when a lane used a sampled people review
335
+ - `projectedRange` for the projected usable or reachable pool that follows from the sample
336
+ - `recentStrongPostCount` when Signals is involved
337
+ - `freshEnoughPostCount` when Signals is involved
338
+ - `avgUsableEngagersPerStrongPost` when Signals is involved
339
+ - estimated usable conversations after sample-quality filtering
340
+ - estimated reachable leads if the team later scrapes or engages the usable lane
341
+ - notable false positives
342
+ - keep / discard decision
343
+ - what to deepen vs discard next
344
+
345
+ When the lane is intended for scalable outbound, classify the projected pool:
346
+
347
+ - `< 500` good fits -> below minimum for a scalable lane; say so explicitly
348
+ - `500-2499` good fits -> workable but may need supplementation or tighter sequencing
349
+ - `2500+` good fits -> ideal scalable lane
350
+
351
+ Do not treat a lane as "good enough" for scale if it does not clear the minimum threshold.
352
+ If a lane is below minimum but clearly promising, return it as "below minimum unless expanded" and include the exact next refinement steps that should be tried.
353
+ Do not claim a percent discount or projected-good-fit estimate unless it comes from a visible sample or you explicitly label it as a weak inference.
354
+
355
+ ### Gate 1
356
+
357
+ Show the light-touch results and ask whether to deep-dispatch or iterate.
358
+
359
+ ## Layer 3: Selective deep exploration
360
+
361
+ Spawn only the validated paths from Gate 1.
362
+
363
+ - `lead-explorer-signals`
364
+ - `lead-explorer-sales-nav`
365
+ - `lead-explorer-prospeo`
366
+
367
+ Each explorer must return:
368
+
369
+ - hypothesis tested
370
+ - search recipe / filters
371
+ - counts
372
+ - best-fit examples
373
+ - failure modes / false positives
374
+ - recommended next move
375
+
376
+ Synthesize the results into `## Lead Strategy`:
377
+
378
+ - ranked personas
379
+ - best source order
380
+ - why each lane won or lost based on evidence, not just totals
381
+ - estimated count range or usable-yield range for the winning lane
382
+ - whether the estimate came from sampled people or only inferred pass-through
383
+ - explicit scale judgment for the winning lane:
384
+ - below minimum
385
+ - workable
386
+ - ideal
387
+ - exclusion rules
388
+ - recommended explorer set
389
+ - WHY NOW signals to bias toward
390
+ - fallback path when the first source underperforms
391
+ - why the non-winning lanes were deprioritized
392
+
393
+ ### Gate 2
394
+
395
+ Ask for approval before freezing the lead strategy.
396
+ After approval:
397
+
398
+ - set kickoff doc status to `FINALIZED`
399
+ - leave offer / messaging / logistics inside `## Deferred to Create Campaign`
400
+ - return the kickoff doc path and summary
401
+
402
+ ## Use Case Playbook
403
+
404
+ - Competitor engagers / topic engagers / community leaders -> `Signals` first, then `Sales Nav` if title/company tightening is needed
405
+ - Behavior or intent heavy ICP with enough ICP-fit conversation density -> `Signals` first; if too noisy, fall back to `Sales Nav`
406
+ - Tight role / company list with strong LinkedIn access -> `Sales Nav` first, then `Prospeo` if the pool is too small
407
+ - Broad persona expansion, named-account targeting, or hiring-led targeting -> `Prospeo` first when it is the clearest lane, else use `Sales Nav` to validate before scaling
408
+ - Existing LinkedIn URL CSV -> bypass discovery and use `load_csv_linkedin_leads`
409
+ in preview mode before approval; do not pass `confirmed: true`,
410
+ `campaignOfferId`, `currentStep`, `leadListId`, or `sourceLeadListId`.
411
+ - Existing Sellable lead list -> bypass discovery and sample from the existing
412
+ rows before approval. The review must say the list was supplied/reused, not
413
+ discovered during this run.
414
+ - Existing domain CSV -> use `load_csv_domains` to create a standalone
415
+ `domainFilterId`, then run a campaignless Prospeo people sample constrained
416
+ by that filter. If the sample is empty or too small, ask whether to widen role
417
+ filters, add domains, or abort; never remove the domain constraint silently.
418
+
419
+ For supplied sources, produce `lead-review.md` and `lead-sample.json` with
420
+ source type, source row/account counts, invalid/duplicate counts, sample method,
421
+ likely-good message handoff rows, and next action. Avoid generic TAM language
422
+ for supplied profile rows and existing lead lists.
423
+
424
+ ## Output Contract
425
+
426
+ Return:
427
+
428
+ - `kickoffDocPath`
429
+ - `status`
430
+ - `recommendedSearchOrder`
431
+ - `validationSummary`
432
+ - `sampledCount`
433
+ - `passCount`
434
+ - `passRate`
435
+ - `projectedRange`
436
+ - `recentStrongPostCount`
437
+ - `freshEnoughPostCount`
438
+ - `avgUsableEngagersPerStrongPost`
439
+ - `estimatedUsefulConversations`
440
+ - `estimatedReachableLeads`
441
+ - `scaleAssessment`
442
+ - `recommendedExplorerSet`
443
+ - `feasibilitySummary`
444
+ - `topPersonas`
445
+ - `deferredTopics`
446
+ - `nextAction`
447
+
448
+ ## Acceptance Rehearsal
449
+
450
+ Before calling this prompt ready, rehearse it against:
451
+
452
+ - `./.planning/phases/02-lead-list-building-automation/02-AMPLIFY-KICKOFF-TRANSCRIPT.md`
453
+
454
+ Compare the resulting kickoff doc outline against:
455
+
456
+ - `./.planning/phases/02-lead-list-building-automation/02-DRYRUN-AMPLIFY-GTM-KICKOFF.md`
457
+
458
+ Passing rehearsal means the prompt can:
459
+
460
+ - extract the ICP / persona layers from the Amplify call
461
+ - write a feasibility check
462
+ - recommend source order from brief quality plus sample evidence instead of one fixed default
463
+ - try alternate hypotheses when the first lane is too weak or noisy
464
+ - estimate recent usable conversation volume instead of only saying keep/discard
465
+ - say clearly when a lane is below the minimum scalable threshold instead of over-recommending it
466
+ - widen and retest a promising but under-scaled lane before returning
467
+ - produce a kickoff doc shape that matches the dry-run sections closely enough for human review