@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.
- package/.claude-plugin/plugin.json +12 -0
- package/.mcp.json +9 -0
- package/README.md +355 -0
- package/dist/api.d.ts +21 -0
- package/dist/api.js +73 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.js +246 -0
- package/dist/engage-memory.d.ts +63 -0
- package/dist/engage-memory.js +354 -0
- package/dist/index-dev.d.ts +2 -0
- package/dist/index-dev.js +17 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +499 -0
- package/dist/skills.d.ts +11 -0
- package/dist/skills.js +97 -0
- package/dist/tools/auth.d.ts +30 -0
- package/dist/tools/auth.js +124 -0
- package/dist/tools/blueprint-commit.d.ts +174 -0
- package/dist/tools/blueprint-commit.js +286 -0
- package/dist/tools/bootstrap.d.ts +64 -0
- package/dist/tools/bootstrap.js +246 -0
- package/dist/tools/campaigns.d.ts +589 -0
- package/dist/tools/campaigns.js +892 -0
- package/dist/tools/cells.d.ts +58 -0
- package/dist/tools/cells.js +48 -0
- package/dist/tools/context.d.ts +88 -0
- package/dist/tools/context.js +271 -0
- package/dist/tools/csv-domains.d.ts +73 -0
- package/dist/tools/csv-domains.js +464 -0
- package/dist/tools/csv-linkedin.d.ts +102 -0
- package/dist/tools/csv-linkedin.js +712 -0
- package/dist/tools/direct-campaigns.d.ts +240 -0
- package/dist/tools/direct-campaigns.js +250 -0
- package/dist/tools/engage-bootstrap.d.ts +94 -0
- package/dist/tools/engage-bootstrap.js +205 -0
- package/dist/tools/engage-discovery.d.ts +78 -0
- package/dist/tools/engage-discovery.js +150 -0
- package/dist/tools/engage-memory.d.ts +181 -0
- package/dist/tools/engage-memory.js +143 -0
- package/dist/tools/engage-state.d.ts +72 -0
- package/dist/tools/engage-state.js +62 -0
- package/dist/tools/enrichment.d.ts +167 -0
- package/dist/tools/enrichment.js +174 -0
- package/dist/tools/flow-preflight.d.ts +68 -0
- package/dist/tools/flow-preflight.js +138 -0
- package/dist/tools/framework.d.ts +44 -0
- package/dist/tools/framework.js +153 -0
- package/dist/tools/interaction-mode.d.ts +27 -0
- package/dist/tools/interaction-mode.js +102 -0
- package/dist/tools/leads.d.ts +2417 -0
- package/dist/tools/leads.js +2307 -0
- package/dist/tools/linkedin.d.ts +210 -0
- package/dist/tools/linkedin.js +229 -0
- package/dist/tools/navigation.d.ts +91 -0
- package/dist/tools/navigation.js +381 -0
- package/dist/tools/one-off.d.ts +229 -0
- package/dist/tools/one-off.js +273 -0
- package/dist/tools/processing.d.ts +70 -0
- package/dist/tools/processing.js +56 -0
- package/dist/tools/prompts.d.ts +211 -0
- package/dist/tools/prompts.js +210 -0
- package/dist/tools/provider-preflight.d.ts +21 -0
- package/dist/tools/provider-preflight.js +59 -0
- package/dist/tools/readiness.d.ts +261 -0
- package/dist/tools/readiness.js +510 -0
- package/dist/tools/rows.d.ts +126 -0
- package/dist/tools/rows.js +105 -0
- package/dist/tools/rubrics.d.ts +497 -0
- package/dist/tools/rubrics.js +681 -0
- package/dist/tools/senders.d.ts +44 -0
- package/dist/tools/senders.js +69 -0
- package/dist/tools/sequencer.d.ts +127 -0
- package/dist/tools/sequencer.js +194 -0
- package/dist/tools/tables.d.ts +35 -0
- package/dist/tools/tables.js +36 -0
- package/dist/tools/verify-row.d.ts +36 -0
- package/dist/tools/verify-row.js +38 -0
- package/dist/tools/workspaces.d.ts +140 -0
- package/dist/tools/workspaces.js +139 -0
- package/dist/utils/workspace-root.d.ts +1 -0
- package/dist/utils/workspace-root.js +39 -0
- package/package.json +46 -0
- package/skills/building-gtm-tables/SKILL.md +216 -0
- package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
- package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
- package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
- package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
- package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
- package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
- package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
- package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
- package/skills/building-gtm-tables/references/verify-loop.md +74 -0
- package/skills/campaign-messages/SKILL.md +173 -0
- package/skills/campaign-messages/flow.v1.json +75 -0
- package/skills/craft-message/SKILL.md +401 -0
- package/skills/create-campaign/ARCHITECTURE.md +232 -0
- package/skills/create-campaign/DISCUSS.md +296 -0
- package/skills/create-campaign/FLOW_ASCII.md +240 -0
- package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
- package/skills/create-campaign/README.md +142 -0
- package/skills/create-campaign/SKILL.md +286 -0
- package/skills/create-campaign/context/README.md +67 -0
- package/skills/create-campaign/context/_TEMPLATE.md +12 -0
- package/skills/create-campaign/context/context.md +35 -0
- package/skills/create-campaign/context/learnings.md +16 -0
- package/skills/create-campaign/context/registry.json +19 -0
- package/skills/create-campaign/core/flow.v1.json +217 -0
- package/skills/create-campaign/core/policy.md +191 -0
- package/skills/create-campaign/core/providers/apollo.json +35 -0
- package/skills/create-campaign/core/providers/prospeo.json +34 -0
- package/skills/create-campaign/core/providers/registry.json +31 -0
- package/skills/create-campaign/core/providers/sales-nav.json +37 -0
- package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
- package/skills/create-campaign/references/brief-template.md +64 -0
- package/skills/create-campaign/references/campaign-quality.md +84 -0
- package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
- package/skills/create-campaign/references/offer-patterns.md +108 -0
- package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
- package/skills/create-campaign/references/question-examples.md +167 -0
- package/skills/create-campaign/references/token-fill-examples.md +81 -0
- package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
- package/skills/create-campaign-brief/DISCUSS.md +64 -0
- package/skills/create-campaign-brief/README.md +176 -0
- package/skills/create-campaign-brief/SKILL.md +537 -0
- package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
- package/skills/create-campaign-brief/references/brief-template.md +220 -0
- package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
- package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
- package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
- package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
- package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
- package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
- package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
- package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
- package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
- package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
- package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
- package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
- package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
- package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
- package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
- package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
- package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
- package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
- package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
- package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
- package/skills/create-campaign-v2/SKILL.md +1619 -0
- package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
- package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
- package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
- package/skills/create-campaign-v2/core/policy.md +82 -0
- package/skills/create-campaign-v2/references/ai-tells.md +253 -0
- package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
- package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
- package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
- package/skills/create-campaign-v2/references/filter-leads.md +495 -0
- package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
- package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
- package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
- package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
- package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
- package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
- package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
- package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
- package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
- package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
- package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
- package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
- package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
- package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
- package/skills/create-campaign-v2-validation/SKILL.md +296 -0
- package/skills/create-post/SKILL.md +1308 -0
- package/skills/create-rubric/SKILL.md +251 -0
- package/skills/engage/SKILL.md +549 -0
- package/skills/engage/core/README.md +23 -0
- package/skills/engage/core/proven-searches.json +11 -0
- package/skills/engage/core/style-guide.template.md +47 -0
- package/skills/engage/core/tracked-people.json +10 -0
- package/skills/enrich-prospects/SKILL.md +97 -0
- package/skills/find-leads/SKILL.md +467 -0
- package/skills/generate-messages/SKILL.md +2361 -0
- package/skills/interview/SKILL.md +132 -0
- package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
- package/skills/interview/core/ICP.template.md +54 -0
- package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
- package/skills/providers/apollo.md +520 -0
- package/skills/providers/prospeo.md +398 -0
- package/skills/providers/sales-nav.md +372 -0
- package/skills/providers/signal-discovery.md +495 -0
- package/skills/research/SKILL.md +258 -0
- package/skills/research/config.json +9 -0
- package/skills/research/override.md +13 -0
- package/skills/research-prospect/SKILL.md +99 -0
- package/skills/research-sender/SKILL.md +158 -0
- 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>
|