@sellable/mcp 0.1.151 → 0.1.152

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 (35) hide show
  1. package/README.md +4 -3
  2. package/agents/post-find-leads-filter-scout.md +5 -4
  3. package/agents/post-find-leads-message-scout.md +15 -14
  4. package/agents/source-scout-linkedin-engagement.md +6 -5
  5. package/agents/source-scout-prospeo-contact.md +4 -4
  6. package/agents/source-scout-sales-nav.md +4 -4
  7. package/dist/index-dev.js +0 -0
  8. package/dist/index.js +0 -0
  9. package/dist/tools/cells.js +1 -1
  10. package/dist/tools/leads.d.ts +36 -3
  11. package/dist/tools/leads.js +83 -71
  12. package/dist/tools/prompts.js +9 -9
  13. package/dist/tools/registry.d.ts +17 -0
  14. package/dist/tools/rubrics.js +23 -20
  15. package/package.json +1 -1
  16. package/skills/create-campaign/SKILL.md +59 -56
  17. package/skills/create-campaign-v2/SKILL.md +43 -42
  18. package/skills/create-campaign-v2/SOUL.md +16 -13
  19. package/skills/create-campaign-v2/core/auto-execute.README.md +16 -17
  20. package/skills/create-campaign-v2/core/auto-execute.yaml +8 -7
  21. package/skills/create-campaign-v2/core/flow.v2.json +81 -149
  22. package/skills/create-campaign-v2/core/policy.md +13 -12
  23. package/skills/create-campaign-v2/references/approval-gate-framing.md +4 -3
  24. package/skills/create-campaign-v2/references/filter-leads.md +5 -4
  25. package/skills/create-campaign-v2/references/lead-validation-preview.md +2 -2
  26. package/skills/create-campaign-v2/references/sample-validation-loop.md +32 -27
  27. package/skills/create-campaign-v2/references/step-13-import-leads.md +29 -28
  28. package/skills/create-campaign-v2/references/watch-guide-narration.md +27 -28
  29. package/skills/create-campaign-v2-tail/SKILL.md +44 -44
  30. package/skills/create-rubric/SKILL.md +5 -5
  31. package/skills/find-leads/SKILL.md +2 -2
  32. package/skills/generate-messages/SKILL.md +2 -1
  33. package/skills/providers/prospeo.md +3 -3
  34. package/skills/providers/sales-nav.md +7 -7
  35. package/skills/providers/signal-discovery.md +11 -11
@@ -51,8 +51,8 @@ Create and save a comprehensive lead scoring rubric that:
51
51
 
52
52
  ## Rubric Validation + Results
53
53
 
54
- - `mcp__sellable__get_rows_minimal` - Read bounded review-batch cell IDs
55
- - `mcp__sellable__queue_cells` - Queue only bounded `enrichCellId` values
54
+ - `mcp__sellable__get_rows_minimal` - Read first review/process sample cell IDs
55
+ - `mcp__sellable__queue_cells` - Queue only bounded sample `enrichCellId` values
56
56
  - `mcp__sellable__wait_for_rubric_results` - Poll pass-rate results
57
57
 
58
58
  `check_rubric` is legacy/recovery only. Do not use it in normal
@@ -207,8 +207,8 @@ update_campaign({
207
207
 
208
208
  This triggers the campaign sync and moves the user to the filter-leads step where they can see the campaign table with scoring columns.
209
209
 
210
- For normal create-campaign-v2 runs, the caller should immediately queue only the
211
- bounded review-batch enrichment cells and wait for scores. For standalone
210
+ For normal create-campaign-v2 runs, the caller should queue only the first
211
+ review/process sample enrichment cells after message approval. For standalone
212
212
  rubric editing, ask the user if we should kick off enrichment for a sample:
213
213
 
214
214
  "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?"
@@ -219,7 +219,7 @@ rubric editing, ask the user if we should kick off enrichment for a sample:
219
219
  ## Phase 5: Enrich + Score a Sample
220
220
 
221
221
  1. Call `get_rows_minimal({ tableId, limit: 5 })` or use the caller-provided
222
- bounded review-batch rows.
222
+ review/process sample rows.
223
223
  2. Call `queue_cells({ tableId, cellIds })` with only pending/error
224
224
  `enrichCellId` values. Do not pass `icpCellId` values or full-table cells;
225
225
  the workflow cascade handles downstream ICP scoring after enrichment.
@@ -162,9 +162,9 @@ Execution flow:
162
162
  - `campaignOfferId`
163
163
  - `sourceLeadListId` (or omit to use `selectedLeadListId`)
164
164
  - `jobId` (from `import_leads` when available; omit for direct CSV lead lists)
165
- - `targetLeadCount` (from `import_leads` when available)
165
+ - `reviewBatchLimit: 15` for the first review/process sample
166
166
  9. For campaign-builder flows, `confirm_lead_list` owns the watched move to
167
- `filter-choice` after the bounded review batch exists. Then run:
167
+ `filter-choice` after the first review/process sample exists. Then run:
168
168
  - `wait_for_campaign_table_ready({ campaignId })`
169
169
  - `get_campaign_context({ campaignId, refresh: true })`
170
170
  - `get_rows_minimal({ tableId: workflowTableId, limit: 10, page: 1 })`
@@ -28,7 +28,8 @@ You craft messages in one of two modes:
28
28
  ### Mode 0: Message Draft Builder Branch
29
29
 
30
30
  Use this mode when create-campaign-v2 starts the background Message Draft
31
- Builder after `confirm_lead_list` imports a non-empty bounded review batch.
31
+ Builder after `confirm_lead_list` copies source rows and the first
32
+ review/process sample exists.
32
33
  This is not the row-cell generation path.
33
34
 
34
35
  Inputs must come from the parent thread or scoped MCP/product tools for the
@@ -62,14 +62,14 @@ search_prospeo({
62
62
  - Pass `searchId` on subsequent pages to paginate.
63
63
  - Use `import_leads` with `provider: \"prospeo\"` and the `searchId` to create a lead list and start import.
64
64
  - **IMPORTANT:** If `import_leads` returns `needsModeSelection: true`, use `AskUserQuestion` to ask "add to existing leads or replace?" Do NOT assume.
65
- - Default source target is about 150 good-fit leads, capped at 2,500 source candidates for now.
65
+ - Default source import target is about 1,000 source contacts. Use the provider cap internally when the raw pool is larger; do not present that cap as the customer-facing plan unless it is reached.
66
66
  - Apply the campaign source planning floor: the sampled/projected good-fit rate
67
67
  after cleanup should be at least 10%. Prospeo is the terminal fallback; if the
68
68
  best reasonable Prospeo lane is still below 10%, tighten the ICP/source
69
69
  direction instead of switching to another provider.
70
- - After the list finishes and the user confirms it looks good, call `confirm_lead_list` with the `jobId` and the review-batch `targetLeadCount` from the active campaign defaults to import only the review batch into the campaign table.
70
+ - After the list finishes and the user confirms it looks good, call `confirm_lead_list` with the `jobId` and `reviewBatchLimit: 15` to copy confirmed rows into the campaign table and use the first 15 as the review/process sample.
71
71
  - `import_leads` owns the watched move to `confirm-lead-list` after a lead list/job exists.
72
- - `confirm_lead_list` owns the watched move to `filter-choice` after the bounded review batch exists.
72
+ - `confirm_lead_list` owns the watched move to `filter-choice` after confirmed campaign rows exist.
73
73
  - Post-confirm readback order is required:
74
74
  1. `wait_for_campaign_table_ready({ campaignId })`
75
75
  2. `get_campaign_context({ campaignId, refresh: true })` then `get_rows_minimal(...)` for recommendation
@@ -354,9 +354,9 @@ Step 4 - Final Search + Confirm:
354
354
  What would you like?"
355
355
 
356
356
  User: "Save it"
357
- → import_leads({campaignOfferId: "cmp_xxx", searchId: "search_xxx", targetLeadCount: 300})
357
+ → import_leads({campaignOfferId: "cmp_xxx", searchId: "search_xxx", targetLeadCount: 1000})
358
358
  → (wait for lead list to finish, ask user to confirm)
359
- → confirm_lead_list({campaignOfferId: "cmp_xxx", jobId: "<jobId from import_leads>", targetLeadCount: 25})
359
+ → confirm_lead_list({campaignOfferId: "cmp_xxx", jobId: "<jobId from import_leads>", reviewBatchLimit: 15})
360
360
  → wait_for_campaign_table_ready({campaignId: "cmp_xxx"})
361
361
  → get_campaign_context({campaignId: "cmp_xxx", refresh: true}) + get_rows_minimal(...)
362
362
  </iteration_example>
@@ -378,17 +378,17 @@ User: "Save it"
378
378
  Call after user selects a search to save
379
379
  **IMPORTANT:** If response returns `needsModeSelection: true`, use `AskUserQuestion` to ask "add to existing leads or replace?" Do NOT assume.
380
380
 
381
- - `confirm_lead_list` - Import confirmed lead list into campaign table
382
- Parameters: campaignOfferId, sourceLeadListId (optional), currentStep (optional)
381
+ - `confirm_lead_list` - Copy confirmed lead list into campaign table
382
+ Parameters: campaignOfferId, sourceLeadListId (optional), reviewBatchLimit (optional, default 15), currentStep (optional)
383
383
  Only call after user confirms the list looks good
384
- Owns the filter-choice beat after bounded review rows exist; then call wait_for_campaign_table_ready -> get_campaign_context + get_rows_minimal
384
+ Owns the filter-choice beat after campaign rows exist; process only the first 15 review rows until later approvals
385
385
  </mcp_tools>
386
386
 
387
387
  <limits>
388
388
  - 25 results per page
389
389
  - Maximum 100 pages (2,500 leads)
390
- - Default source target: about 150 good-fit leads, capped at 2,500 source
391
- candidates for now
390
+ - Default source import target: about 1,000 source contacts. The provider cap is
391
+ internal; do not present it as the customer-facing plan unless it is reached.
392
392
  - Maximum 5 search calls per session
393
393
  - If user needs more than 2,500: explain limit, suggest splitting by region
394
394
  </limits>
@@ -450,15 +450,16 @@ to say **yes**.
450
450
 
451
451
  For `create-campaign-v2` after the user has already approved the lead-source
452
452
  decision, that approval is the explicit confirmation to materialize the approved
453
- source list and then import only the bounded campaign review batch. In that
453
+ source list and then copy the confirmed source rows into the campaign. In that
454
454
  tail flow, follow `create-campaign-v2-tail`: call
455
455
  `select_promising_posts({ campaignOfferId, selectionMode: "replace",
456
456
  selections, headlineICPCriteria })`, then call
457
457
  `import_leads({ campaignOfferId, provider: "signal-discovery",
458
- targetLeadCount, targetEngagerCount, maxPostsToScrape })` for the approved
458
+ targetEngagerCount, maxPostsToScrape })` for the approved
459
459
  source-capacity plan without asking for another yes/no gate. Then
460
- `confirm_lead_list` imports only the bounded review batch into the campaign
461
- table. Do not confuse the source-candidate target with the review-batch size.
460
+ `confirm_lead_list({ reviewBatchLimit: 15 })` copies confirmed source rows into
461
+ the campaign table and returns the first 15 review/process rows. Do not confuse
462
+ the source-candidate target with the review sample size.
462
463
  If the completed source scrape comes back below the approved source-candidate
463
464
  target, do not call `confirm_lead_list`; select more posts, rerun source
464
465
  discovery, or move to Sales Nav.
@@ -474,9 +475,8 @@ the source-list materialization.
474
475
  ```json
475
476
  import_leads({
476
477
  "campaignOfferId": "cmp_xxx",
477
- "targetLeadCount": 1000,
478
- "targetEngagerCount": 1000,
479
- "maxPostsToScrape": 5
478
+ "targetEngagerCount": 1500,
479
+ "maxPostsToScrape": 3
480
480
  })
481
481
  ```
482
482
 
@@ -488,13 +488,13 @@ After the lead list finishes and the user confirms it looks good, call:
488
488
  confirm_lead_list({
489
489
  "campaignOfferId": "cmp_xxx",
490
490
  "jobId": "<jobId from import_leads>",
491
- "targetLeadCount": 25
491
+ "reviewBatchLimit": 15
492
492
  })
493
493
  ```
494
494
 
495
495
  Then run post-confirm routing in this order:
496
496
 
497
- 1. `confirm_lead_list` owns the watched move to `filter-choice` after the bounded review batch exists; do not call `update_campaign` to fix that step.
497
+ 1. `confirm_lead_list` owns the watched move to `filter-choice` after confirmed campaign rows exist; do not call `update_campaign` to fix that step.
498
498
  2. `wait_for_campaign_table_ready({ campaignId: "cmp_xxx" })`
499
499
  3. `get_campaign_context({ campaignId: "cmp_xxx", refresh: true })` then `get_rows_minimal(...)`
500
500
 
@@ -516,8 +516,8 @@ Then run post-confirm routing in this order:
516
516
  5. Standalone Signal Discovery flow: ask for explicit confirmation to import
517
517
  leads (e.g., "Does this look right? Should I import leads now?").
518
518
  `create-campaign-v2` tail flow: if the user already approved the source
519
- decision, that approval is the import confirmation for the bounded review
520
- batch; do not ask again.
519
+ decision, that approval is the import confirmation for the source list and
520
+ first review sample; do not ask again.
521
521
  6. If confirmation exists, call `import_leads`. If not, refine
522
522
  selections/criteria and ask again.
523
523
  7. When the lead list finishes and the user confirms it looks good, call