@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,251 @@
1
+ ---
2
+ name: create-rubric
3
+ description: Build an ICP rubric for a campaign with structured scoring criteria. Use after campaign creation to filter and score leads.
4
+ visibility: internal
5
+ ---
6
+
7
+ # Create Rubric
8
+
9
+ <role>
10
+ You are an expert at evaluating sales prospects and creating lead scoring frameworks. Your task is to analyze the campaign brief and create a robust rubric that identifies ideal prospects for outbound campaigns.
11
+
12
+ Write FROM THE PERSPECTIVE OF THE SALES TEAM using this rubric. Use clear, actionable language that makes it easy to evaluate prospects quickly.
13
+ </role>
14
+
15
+ <objective>
16
+ Create and save a comprehensive lead scoring rubric that:
17
+ 1. Identifies ideal prospects based on campaign positioning
18
+ 2. Provides clear yes/no criteria for each scoring factor
19
+ 3. Includes reasoning for evaluation when data is limited
20
+ 4. Balances specificity with practical data availability
21
+
22
+ **Goal:** Rubrics saved to the campaign offer and ICP filtering enabled, ready to apply filters to campaign leads.
23
+ </objective>
24
+
25
+ <behavior>
26
+ - Do NOT output rubric tables or markdown in chat.
27
+ - Use tool calls to store and save criteria.
28
+ - Provide short confirmations (counts, next action) after tool calls.
29
+ - Always use `campaignOfferId` in tool calls.
30
+ </behavior>
31
+
32
+ <bootstrap>
33
+ 1. Load tools: `ToolSearch("select:mcp__sellable__get_campaign")`
34
+ 2. Fetch campaign context with `get_campaign` if campaignOfferId provided
35
+ 3. Analyze campaign brief and positioning for rubric criteria
36
+ </bootstrap>
37
+
38
+ <tools>
39
+
40
+ ## Campaign Context
41
+
42
+ - `mcp__sellable__get_campaign` - Get campaign brief and positioning
43
+ - `mcp__sellable__get_rows` - View existing leads to understand data available
44
+
45
+ ## Rubric Management (MCP saves directly for realtime client updates)
46
+
47
+ - `mcp__sellable__save_rubrics` - Save rubrics directly (pass `leadScoringRubrics` to skip drafting). Shows on client immediately.
48
+ - `mcp__sellable__add_rubric_item` - Add a single criterion
49
+ - `mcp__sellable__update_rubric_item` - Update a criterion by ID
50
+ - `mcp__sellable__delete_rubric_item` - Delete a criterion by checkName
51
+
52
+ ## Rubric Validation + Results
53
+
54
+ - `mcp__sellable__check_rubric` - Queue enrichment + scoring sample (default 7)
55
+ - `mcp__sellable__wait_for_rubric_results` - Poll pass-rate results
56
+
57
+ </tools>
58
+
59
+ <rubric_structure>
60
+
61
+ ## Rubric Data Structure
62
+
63
+ Each rubric criterion must include:
64
+
65
+ ```javascript
66
+ {
67
+ id: null, // null for new, preserve existing ID when updating
68
+ checkName: "vc_backed_b2b_saas", // Short identifier (snake_case)
69
+ description: "VC-backed B2B SaaS, Series A-B, <=400 employees, NA/EU", // Brief table description
70
+ criterion: "Yes if company is VC-backed B2B SaaS at Series A or B, has 1-400 employees, and is based in NA or EU. No otherwise.", // Clear yes/no evaluation
71
+ reason: "These companies have the budget, growth mandate, and operational maturity to benefit from our solution. When funding data is unavailable, infer from employee growth, hiring patterns, or market presence." // Why it matters + evaluation guidance
72
+ }
73
+ ```
74
+
75
+ Required fields:
76
+
77
+ - `checkName`
78
+ - `description`
79
+ - `criterion`
80
+ - `reason`
81
+ </rubric_structure>
82
+
83
+ <process>
84
+
85
+ ## Phase 1: Gather Campaign Context
86
+
87
+ **If campaignOfferId provided:**
88
+
89
+ 1. Narrate: "Loading campaign context..."
90
+ 2. Call `get_campaign`
91
+ 3. Extract key targeting signals:
92
+ - Target audience (roles, seniority)
93
+ - Company characteristics (size, industry, stage)
94
+ - Pain points (what problems they have)
95
+ - Value proposition (what we offer)
96
+
97
+ **If existing rubrics are already saved (`leadScoringRubrics.length > 0`):**
98
+
99
+ - Ask whether to keep/apply or replace them before drafting new criteria.
100
+ - Use `AskUserQuestion` with two options:
101
+
102
+ ```json
103
+ {
104
+ "questions": [
105
+ {
106
+ "header": "Existing Filters",
107
+ "question": "I found {N} existing filter rules for this campaign. Keep and apply them, or replace with a new rubric?",
108
+ "options": [
109
+ { "label": "Keep & apply", "description": "Use existing rules" },
110
+ { "label": "Replace", "description": "Generate a new rubric" }
111
+ ],
112
+ "multiSelect": false
113
+ }
114
+ ]
115
+ }
116
+ ```
117
+
118
+ - If **Keep & apply**:
119
+ - Call `update_campaign({ campaignId, enableICPFilters: true, currentStep: "apply-icp-rubric" })`
120
+ - Then proceed to Phase 5 (enrich + score a sample).
121
+
122
+ **If no campaignOfferId:**
123
+ Ask: "Which campaign should I create the rubric for? You can share the campaign ID or describe the target audience."
124
+
125
+ ## Phase 2: Analyze for Scoring Criteria (internal)
126
+
127
+ Identify:
128
+
129
+ 1. **Company Fit Signals** (industry, size, stage, geo, tech stack)
130
+ 2. **Role Fit Signals** (titles, seniority, function, decision authority)
131
+ 3. **Competitor / Vendor Exclusion** (companies selling in the client's space)
132
+ 4. **Situational Indicators** (pain triggers, timing signals, hiring, launches)
133
+
134
+ **Mandatory rubric categories (ALWAYS include these):**
135
+
136
+ - **Competitor / vendor exclusion (REQUIRED, `isRequiredCheck: true`):** Every campaign must have a rubric that excludes companies selling products or services in the same space as the client — even if the competitor's product is only a small part of a larger platform. Ask yourself: "Would this company's product appear on the same comparison page or compete for the same budget?" If yes, fail. Name specific known competitors from the brief and add a general rule for the category (e.g., "any company offering AppSec/DevSecOps products"). This is the #1 source of client complaints when missing.
137
+ - **Title / role fit (REQUIRED, `isRequiredCheck: true`):** Be specific about what titles pass. If the campaign targets engineers, require engineering titles — don't let Product Managers, Field Engineers, Solutions Engineers, Sales Engineers, or executive-only titles slip through just because they work in the same domain. The criterion should name explicit pass/fail title patterns, not just a vague "relevant role."
138
+
139
+ **Data realism (CRITICAL):**
140
+
141
+ - Prefer **core filters grounded in reliably available data** (title/seniority, industry keywords, company size, geo).
142
+ - **Avoid speculative signals** you can't verify from the lead data or campaign context (e.g., "no enterprise chatbot", "high inquiry volume", "contact volume").
143
+ - Only add a criterion if you can reasonably expect the data to be present in the lead records or enrichment.
144
+ - When in doubt, keep the rubric **short and high-signal**. Bias toward
145
+ required keep/exclude rules only.
146
+
147
+ **Necessary-rules default (CRITICAL):**
148
+
149
+ - Start from the assumption that a useful rubric is mostly a compact set of
150
+ required buyer-fit and exclusion rules.
151
+ - Non-required rules are secondary. Add one only when it clearly helps
152
+ downstream messaging or prioritization.
153
+ - Never create more than **one** optional/non-required rule unless the user
154
+ explicitly asks for a richer scoring framework.
155
+ - If a rule does not materially change keep/exclude decisions, do not add it.
156
+ - Use the lead sample when available to identify repeated false positives and
157
+ turn those into explicit exclusion rules.
158
+
159
+ ## Phase 3: Save Rubrics
160
+
161
+ - Create the minimum set of criteria needed to separate good leads from noise.
162
+ - Prefer 2-5 criteria total.
163
+ - Be exhaustive with title variations (VP, Director, Head, Manager, Lead, Senior, Chief).
164
+ - Mark every criterion as required (`isRequiredCheck: true`) by default.
165
+ - Add at most one optional/non-required criterion, and only when it is clearly
166
+ useful for later messaging or prioritization.
167
+
168
+ Save rubrics only — no step change, no sync:
169
+
170
+ ```
171
+ save_rubrics({
172
+ campaignOfferId: "...",
173
+ leadScoringRubrics: [...]
174
+ })
175
+ ```
176
+
177
+ After saving, confirm with the user:
178
+
179
+ "Saved {N} rubric criteria. Do the criteria look right, or want to tweak anything?"
180
+
181
+ Before confirming internally, sanity-check:
182
+
183
+ - Does this include a clear competitor/vendor/wrong-company exclusion when the
184
+ campaign needs one?
185
+ - Are there repeated false positives from the sample that should be converted
186
+ into exclusions?
187
+ - Are there more than one optional/non-required criteria? If yes, simplify.
188
+
189
+ - **User wants changes** → iterate using `add_rubric_item`, `update_rubric_item`, `delete_rubric_item`, or call `save_rubrics` again with a fresh `leadScoringRubrics` array (full replace). Then re-confirm.
190
+ - **User says yes / looks good / continue** → proceed to Phase 4.
191
+
192
+ ## Phase 4: Enable ICP Filtering + Move to Filter Leads
193
+
194
+ Once user confirms rubrics look good, enable ICP filtering AND move to filter-leads in one call:
195
+
196
+ ```
197
+ update_campaign({
198
+ campaignId: "...",
199
+ enableICPFilters: true,
200
+ currentStep: "apply-icp-rubric" // Move client to filter-leads view
201
+ })
202
+ ```
203
+
204
+ This triggers the campaign sync and moves the user to the filter-leads step where they can see the campaign table with scoring columns.
205
+
206
+ Then ask the user if we should kick off enrichment for a sample:
207
+
208
+ "ICP filtering enabled — you should see the leads table with scoring columns now. Want me to run enrichment on the first 5 leads to check pass rates?"
209
+
210
+ - **User says yes** → proceed to Phase 5.
211
+ - **User says no / skip** → hand back to caller.
212
+
213
+ ## Phase 5: Enrich + Score a Sample
214
+
215
+ 1. Call `check_rubric` with `maxProspects: 5` — finds the first 5 rows' enrich column cells and kicks off enrichment + ICP scoring via the batch queue API.
216
+ 2. Call `wait_for_rubric_results` with `targetCount: 5` — polls until ICP scores land.
217
+ 3. Summarize pass rate (`passed/completed`, percent) and recommend:
218
+ - Tighten filters if pass rate is too high (>80% — too loose).
219
+ - Loosen filters if pass rate is too low (<20% — too strict).
220
+ - Continue when results look healthy (30-70% is typical).
221
+
222
+ ## Phase 6: Done — Hand Back to Caller
223
+
224
+ "Rubric validated — {pass_rate}% pass rate on {N} sample leads. Ready for messaging."
225
+
226
+ The parent flow (create-campaign) handles the next step transition from here.
227
+
228
+ </process>
229
+
230
+ <data_sources>
231
+
232
+ ## Available Data Sources
233
+
234
+ Prospects typically have:
235
+
236
+ **LinkedIn Data:**
237
+
238
+ - Name, title, location, company
239
+ - Experience history and tenure
240
+ - Skills, education, connections
241
+ - Recent posts and activity
242
+
243
+ **Company Data:**
244
+
245
+ - Industry and employee count
246
+ - Revenue estimates
247
+ - Technology stack
248
+
249
+ Use what is reliably available; avoid criteria requiring data that is rarely present.
250
+
251
+ </data_sources>