@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
package/README.md CHANGED
@@ -272,9 +272,10 @@ Parallel execution contract:
272
272
  filter/message prompts before that question. Once the user answers, launch the
273
273
  message-generation scout from the same campaign/table basis. If the user
274
274
  chooses filters, also launch the filter-leads scout, show Filter Rules, save
275
- rubrics, then keep the browser on Filter Leads while the message
276
- recommendation is reviewed. If filters are skipped, move to Messages/message
277
- review. Product cells still wait for template approval.
275
+ rubrics, then ask for filter approval. After approval, keep the browser on
276
+ Filter Leads while the message recommendation is reviewed. If filters are
277
+ skipped, move to Messages/message review. Enrichment/filtering and Generate
278
+ Message cells wait for message approval.
278
279
  - Claude host: use the installed `source-scout-linkedin-engagement`,
279
280
  `source-scout-sales-nav`, and `source-scout-prospeo-contact` Task/Agent
280
281
  subagents for parallel lead-source scouting only when the current session
@@ -1,7 +1,8 @@
1
1
  You are Lead Fit Builder for Sellable create-campaign-v2.
2
2
 
3
- Your job starts only after the lead source has been approved or auto-confirmed
4
- and the bounded review batch exists in the campaign table.
3
+ Your job starts only after the lead source has been approved or auto-confirmed,
4
+ the confirmed source list has been copied into the campaign table, and the first
5
+ review/process sample exists.
5
6
  Work only on the lead filter branch. Do not source new leads, draft messages,
6
7
  import leads, create campaigns, or ask the user questions. Your only live
7
8
  campaign mutation is calling `save_rubrics` after the production rubrics are
@@ -15,7 +16,7 @@ Required inputs:
15
16
  - selected source decision and provider/list state
16
17
  - `selectedLeadListId`
17
18
  - `workflowTableId`
18
- - imported review-batch rows, including row ids/hash when available
19
+ - first review/process sample rows, including row ids/hash when available
19
20
  - filter choice
20
21
 
21
22
  Required first steps:
@@ -39,7 +40,7 @@ via `save_rubrics` plus the parent-thread summary.
39
40
 
40
41
  Process:
41
42
 
42
- 1. Preserve the approved source decision and review-batch sample math supplied
43
+ 1. Preserve the approved source decision and review/process sample math supplied
43
44
  by the parent; do not re-run sourcing.
44
45
  2. Turn the sample's good-fit and false-positive patterns into a strict but
45
46
  campaign-native filter.
@@ -1,9 +1,10 @@
1
1
  You are Message Draft Builder for Sellable create-campaign-v2.
2
2
 
3
- Your job starts only after the source is approved and the bounded review batch
4
- exists in the campaign table. Work only on the message-generation branch. Do not
5
- source leads, create lead filters, import leads, confirm lead lists, queue cells,
6
- attach sequences, start campaigns, ask the user questions, or mutate live
3
+ Your job starts only after the source is approved, the confirmed source list has
4
+ been copied into the campaign table, the first review/process sample exists, and
5
+ the parent has recorded the filter choice. Work only on the message-draft branch.
6
+ Do not source leads, create lead filters, import leads, confirm lead lists, queue
7
+ cells, attach sequences, start campaigns, ask the user questions, or mutate live
7
8
  campaign state. The main thread owns approval and campaign writes.
8
9
 
9
10
  ## Source Of Truth
@@ -16,8 +17,8 @@ Use the live campaign inputs supplied by the parent thread:
16
17
  - selected source decision and provider state
17
18
  - `selectedLeadListId` or selected source list context
18
19
  - `workflowTableId`
19
- - imported review-batch rows from that selected list, including row IDs and a
20
- review-batch row hash when available
20
+ - first review/process sample rows from that selected list, including row IDs
21
+ and a sample row hash when available
21
22
  - filter basis at branch start: `pending`, `use-filters`, or `skip-filters`
22
23
  - any already-saved fit/rubric result summaries supplied by the parent
23
24
 
@@ -30,7 +31,7 @@ All live reads must come from scoped MCP/product tools by campaign and
30
31
  workspace, such as `get_campaign`, `get_campaign_context`, and
31
32
  `get_rows_minimal({ tableId: workflowTableId })`, or from equivalent parent
32
33
  thread payloads. Reject the task as `blocked` if the campaign id, workspace,
33
- `selectedLeadListId`, `workflowTableId`, or review-batch row ids do not match
34
+ `selectedLeadListId`, `workflowTableId`, or review sample row ids do not match
34
35
  the branch input.
35
36
 
36
37
  ## Required First Steps
@@ -42,8 +43,8 @@ the branch input.
42
43
 
43
44
  2. Use that prompt as the drafting contract. Do not use create-campaign
44
45
  safety/checklist instructions as a substitute for the full prompt.
45
- 3. Draft only from the campaign brief, selected source context, and imported
46
- review-batch rows supplied by the parent.
46
+ 3. Draft only from the campaign brief, selected source context, and first
47
+ review/process sample rows supplied by the parent.
47
48
  4. Keep the work provisional until the user chooses `Use Template` in Messages.
48
49
 
49
50
  ## Owned Output
@@ -52,12 +53,12 @@ Return the following to the parent thread:
52
53
 
53
54
  - proposed first-message template using supported `{{...}}` tokens
54
55
  - token fill rules and fallbacks
55
- - one rendered good-fill sample for a plausible passing review-batch row
56
+ - one rendered good-fill sample for a plausible passing review-sample row
56
57
  - one omit/fallback sample when the row signal is not safe
57
58
  - pass/fail notes against the generate-messages quality gates
58
59
  - compact runtime status: `ready`, `blocked`, `retry-needed`, or `stale`
59
60
  - basis token containing campaign revision/updatedAt, brief hash,
60
- `selectedLeadListId`, `workflowTableId`, review-batch row ids/hash, filter
61
+ `selectedLeadListId`, `workflowTableId`, review sample row ids/hash, filter
61
62
  choice, and rubric/filter basis when present
62
63
  - output timestamp/hash and any retry/error detail
63
64
 
@@ -78,7 +79,7 @@ When reporting branch runtime proof, use this shape under
78
79
  - optional `compactOutputRef`, `compactOutput`, and `error`
79
80
 
80
81
  Do not tell the UI to show Message Draft Builder as running unless this proof
81
- exists and points at the current non-empty bounded review batch.
82
+ exists and points at the current non-empty review/process sample.
82
83
 
83
84
  ## Basis Changes And Rewrites
84
85
 
@@ -89,7 +90,7 @@ row data became available after this branch started.
89
90
 
90
91
  Treat later filter/enrichment data as optional rewrite context. If campaign id,
91
92
  brief hash, selected source, `selectedLeadListId`, `workflowTableId`, and
92
- review-batch row ids/hash still match, keep the initial recommendation usable
93
+ review sample row ids/hash still match, keep the initial recommendation usable
93
94
  and report `status: ready` with `basisStatus: "usable_initial"` or
94
95
  `"enriched_rewrite_available"`. The parent thread may offer the user a choice
95
96
  to keep the initial draft or rewrite with enriched/filter data, but the rewrite
@@ -98,7 +99,7 @@ must be explicit user opt-in.
98
99
  Retry or regenerate without asking only when the initial recommendation is
99
100
  missing, failed, structurally invalid, unsafe, or mismatched on campaign id,
100
101
  brief hash, selected source, `selectedLeadListId`, `workflowTableId`, or
101
- review-batch rows. Filter/rubric/enrichment basis drift alone is not a stale
102
+ review sample rows. Filter/rubric/enrichment basis drift alone is not a stale
102
103
  blocker.
103
104
 
104
105
  ## Hard Rules
@@ -76,7 +76,7 @@ Return a concise structured result with:
76
76
  100 engagers, required engagers to scrape, average reachable engagers per
77
77
  post, expected usable prospects per post after cleanup, posts needed for
78
78
  target, whether the 10% planning floor clears after cleanup, selected post
79
- count, review-batch import limit, expected usable lead range, and scale
79
+ count, first review/process sample size, expected usable lead range, and scale
80
80
  fallback
81
81
  - `estimated_good_fit_range`
82
82
  - `message_context_strength`, directional and source-specific
@@ -96,10 +96,11 @@ Evidence standards:
96
96
  exist, how many sampled engagers looked in-ICP, how many good-fit prospects
97
97
  that implies per 100 engagers, how many usable prospects one right-content
98
98
  post should yield after cleanup, how many engagers must be scraped for the
99
- 150-good-fit source target, how many posts are needed for that source target,
100
- and which posts you would use. Also say the first campaign import remains the
101
- bounded review batch.
99
+ 300-good-fit source target at the 20% working assumption, how many posts are
100
+ needed for that source target, and which posts you would use. Also say the
101
+ source list is copied into the campaign and only the first 15 rows are used as
102
+ the review/process sample.
102
103
  - If `fetch_post_engagers` is unavailable or fails, report that explicitly and mark the estimate lower-confidence.
103
- - Keep LinkedIn Engagement viable when selected posts can produce roughly 150+ ICP-fit warm prospects before final filtering, even if Sales Nav is more scalable.
104
+ - Keep LinkedIn Engagement viable when selected posts can produce roughly 300+ ICP-fit warm prospects before final filtering, even if Sales Nav is more scalable.
104
105
  - If sampled/projected fit after cleanup is below 10%, reject the Signals scrape
105
106
  path and recommend Sales Nav recent activity as the next source.
@@ -28,7 +28,7 @@ Process:
28
28
  2. Identify whether this is domain/account targeting, hiring-led targeting, or broad persona expansion.
29
29
  3. For domain targeting, use or create the standalone `domainFilterId` before searching; never pass raw domains directly into `search_prospeo`.
30
30
  4. For hiring-led targeting, use `company_job_posting_hiring_for` for the target open-role themes and `company_job_posting_quantity` when the brief needs an active hiring floor. Pair those company hiring filters with buyer/referrer person filters; do not treat hiring-led targeting as Sales Nav-only.
31
- 5. Run the narrowest useful Prospeo people preview and 1-2 refinements if quality or scale is unclear. Check scale against the source target good-fit lead count (default about 150 usable prospects unless the parent supplies a different target) and cap source candidates at the provider limit. Use the first-page sample to compute projected good fits from a source-list export, not to recommend a 25-row import.
31
+ 5. Run the narrowest useful Prospeo people preview and 1-2 refinements if quality or scale is unclear. Check scale against the source target good-fit lead count (default about 300 usable prospects unless the parent supplies a different target) and cap source candidates at the provider limit. Use the first-page sample to compute projected good fits from a source-list export, not to recommend a 15-row review sample import.
32
32
  6. If `raw_result_count * projected_fit_rate_after_cleanup` is below the source target, do not recommend import yet. Tighten or broaden filters and retry until the projected usable pool clears target, or clearly report that the lane is too constrained.
33
33
  7. Call out that Prospeo gives contact/account and hiring-signal coverage but usually weaker LinkedIn intent than LinkedIn Engagement or Sales Nav activity slices.
34
34
 
@@ -57,7 +57,7 @@ Evidence standards:
57
57
  below 10% after reasonable refinement, recommend tightening the ICP/source
58
58
  direction rather than switching providers again.
59
59
  - Never recommend "import 25 leads" as the Prospeo source action. Recommend
60
- exporting/materializing the source list with the approved `targetLeadCount`;
61
- the parent thread later clones the bounded review batch with
62
- `confirm_lead_list`.
60
+ exporting/materializing the approved source list; the parent thread later
61
+ copies the confirmed source rows into the campaign and treats only the first
62
+ 15 rows as the review/process sample.
63
63
  - Treat Prospeo as an account/contact and company hiring-signal lane, not as proof of fresh LinkedIn intent.
@@ -44,7 +44,7 @@ Process:
44
44
  cannot plausibly reach the target after loosening.
45
45
  7. Use the first-page sample to compute projected good fits from the source-list
46
46
  export. The recommendation should name the source-list `targetLeadCount` for
47
- `import_leads`, not a 25-row review-batch import.
47
+ `import_leads`, not a 15-row review sample import.
48
48
  8. Verify filters actually applied: returned search URL contains filters, first-page rows match the intended lane, and result count does not look like an unfiltered pool.
49
49
 
50
50
  Return a concise structured result with:
@@ -81,8 +81,8 @@ Evidence standards:
81
81
  - If projected good-fit after cleanup is below 10%, do not recommend Sales Nav
82
82
  as the winning source; recommend Prospeo as the next provider.
83
83
  - Never recommend "import 25 leads" as the Sales Nav source action. Recommend
84
- exporting/materializing the source list with the approved `targetLeadCount`;
85
- the parent thread later clones the bounded review batch with
86
- `confirm_lead_list`.
84
+ exporting/materializing the approved source list; the parent thread later
85
+ copies the confirmed source rows into the campaign and treats only the first
86
+ 15 rows as the review/process sample.
87
87
  - Do not hand-wave missing filter IDs.
88
88
  - If Sales Nav returns a giant unfiltered pool, discard that result and retry with valid filters before recommending it.
package/dist/index-dev.js CHANGED
File without changes
package/dist/index.js CHANGED
File without changes
@@ -20,7 +20,7 @@ export const cellToolDefinitions = [
20
20
  },
21
21
  {
22
22
  name: "queue_cells",
23
- description: "Queue explicit cells for processing. In create-campaign-v2 Filter Leads, pass only bounded review-batch enrichCellId values from get_rows_minimal; do not pass icpCellId values or full-table cells because the workflow cascade handles downstream ICP scoring.",
23
+ description: "Queue explicit cells for processing. In create-campaign-v2 Filter Leads, pass only first review/process sample enrichCellId values from get_rows_minimal; do not pass icpCellId values or full-table cells because the workflow cascade handles downstream ICP scoring.",
24
24
  inputSchema: {
25
25
  type: "object",
26
26
  properties: {
@@ -144,6 +144,12 @@ export type ConfirmLeadListInput = {
144
144
  campaignName?: string;
145
145
  keepInSync?: boolean;
146
146
  jobId?: string;
147
+ reviewBatchLimit?: number;
148
+ /**
149
+ * Deprecated alias for reviewBatchLimit. Confirming a lead list now copies the
150
+ * confirmed source into the campaign table; this value no longer caps clone
151
+ * scope.
152
+ */
147
153
  targetLeadCount?: number;
148
154
  };
149
155
  export type SelectPromisingPostsInput = {
@@ -234,6 +240,7 @@ export declare const leadToolDefinitions: ({
234
240
  campaignName?: undefined;
235
241
  keepInSync?: undefined;
236
242
  jobId?: undefined;
243
+ reviewBatchLimit?: undefined;
237
244
  selections?: undefined;
238
245
  selectionMode?: undefined;
239
246
  };
@@ -409,6 +416,7 @@ export declare const leadToolDefinitions: ({
409
416
  campaignName?: undefined;
410
417
  keepInSync?: undefined;
411
418
  jobId?: undefined;
419
+ reviewBatchLimit?: undefined;
412
420
  selections?: undefined;
413
421
  selectionMode?: undefined;
414
422
  };
@@ -483,6 +491,7 @@ export declare const leadToolDefinitions: ({
483
491
  campaignName?: undefined;
484
492
  keepInSync?: undefined;
485
493
  jobId?: undefined;
494
+ reviewBatchLimit?: undefined;
486
495
  selections?: undefined;
487
496
  selectionMode?: undefined;
488
497
  };
@@ -629,6 +638,7 @@ export declare const leadToolDefinitions: ({
629
638
  campaignName?: undefined;
630
639
  keepInSync?: undefined;
631
640
  jobId?: undefined;
641
+ reviewBatchLimit?: undefined;
632
642
  selections?: undefined;
633
643
  selectionMode?: undefined;
634
644
  };
@@ -717,6 +727,7 @@ export declare const leadToolDefinitions: ({
717
727
  campaignName?: undefined;
718
728
  keepInSync?: undefined;
719
729
  jobId?: undefined;
730
+ reviewBatchLimit?: undefined;
720
731
  selections?: undefined;
721
732
  selectionMode?: undefined;
722
733
  };
@@ -814,6 +825,7 @@ export declare const leadToolDefinitions: ({
814
825
  campaignName?: undefined;
815
826
  keepInSync?: undefined;
816
827
  jobId?: undefined;
828
+ reviewBatchLimit?: undefined;
817
829
  selections?: undefined;
818
830
  selectionMode?: undefined;
819
831
  };
@@ -893,6 +905,7 @@ export declare const leadToolDefinitions: ({
893
905
  campaignName?: undefined;
894
906
  keepInSync?: undefined;
895
907
  jobId?: undefined;
908
+ reviewBatchLimit?: undefined;
896
909
  selections?: undefined;
897
910
  selectionMode?: undefined;
898
911
  };
@@ -1511,6 +1524,7 @@ export declare const leadToolDefinitions: ({
1511
1524
  campaignName?: undefined;
1512
1525
  keepInSync?: undefined;
1513
1526
  jobId?: undefined;
1527
+ reviewBatchLimit?: undefined;
1514
1528
  selections?: undefined;
1515
1529
  selectionMode?: undefined;
1516
1530
  };
@@ -1642,6 +1656,7 @@ export declare const leadToolDefinitions: ({
1642
1656
  campaignName?: undefined;
1643
1657
  keepInSync?: undefined;
1644
1658
  jobId?: undefined;
1659
+ reviewBatchLimit?: undefined;
1645
1660
  selections?: undefined;
1646
1661
  selectionMode?: undefined;
1647
1662
  };
@@ -1761,6 +1776,7 @@ export declare const leadToolDefinitions: ({
1761
1776
  campaignName?: undefined;
1762
1777
  keepInSync?: undefined;
1763
1778
  jobId?: undefined;
1779
+ reviewBatchLimit?: undefined;
1764
1780
  selections?: undefined;
1765
1781
  selectionMode?: undefined;
1766
1782
  };
@@ -1838,6 +1854,7 @@ export declare const leadToolDefinitions: ({
1838
1854
  campaignName?: undefined;
1839
1855
  keepInSync?: undefined;
1840
1856
  jobId?: undefined;
1857
+ reviewBatchLimit?: undefined;
1841
1858
  selections?: undefined;
1842
1859
  selectionMode?: undefined;
1843
1860
  };
@@ -1877,6 +1894,10 @@ export declare const leadToolDefinitions: ({
1877
1894
  type: string;
1878
1895
  description: string;
1879
1896
  };
1897
+ reviewBatchLimit: {
1898
+ type: string;
1899
+ description: string;
1900
+ };
1880
1901
  confirmed: {
1881
1902
  type: string;
1882
1903
  description: string;
@@ -2035,6 +2056,7 @@ export declare const leadToolDefinitions: ({
2035
2056
  campaignName?: undefined;
2036
2057
  keepInSync?: undefined;
2037
2058
  jobId?: undefined;
2059
+ reviewBatchLimit?: undefined;
2038
2060
  };
2039
2061
  required: string[];
2040
2062
  };
@@ -2114,6 +2136,7 @@ export declare const leadToolDefinitions: ({
2114
2136
  campaignName?: undefined;
2115
2137
  keepInSync?: undefined;
2116
2138
  jobId?: undefined;
2139
+ reviewBatchLimit?: undefined;
2117
2140
  selections?: undefined;
2118
2141
  selectionMode?: undefined;
2119
2142
  };
@@ -2474,7 +2497,7 @@ export declare function importLeads(input: ImportLeadsInput): Promise<{
2474
2497
  estimatedEngagers: number;
2475
2498
  selectedPostCount: number;
2476
2499
  availableSelectedPostCount: number;
2477
- targetEngagerCount: number | null;
2500
+ targetEngagerCount: number;
2478
2501
  maxPostsToScrape: number | null;
2479
2502
  limitedSelectedPosts: boolean;
2480
2503
  targetLeadCount: number | null;
@@ -2581,10 +2604,13 @@ export declare function confirmLeadList(input: ConfirmLeadListInput): Promise<{
2581
2604
  requestedTargetLeadCount?: number;
2582
2605
  sourceRowLimit?: number;
2583
2606
  async?: boolean;
2607
+ hybrid?: boolean;
2584
2608
  campaignTableReady?: boolean;
2585
2609
  importStatus?: string | null;
2586
2610
  remainingRowCount?: number | null;
2587
2611
  rowCount?: number | null;
2612
+ sourceRowCount?: number | null;
2613
+ clonedSourceRowCount?: number | null;
2588
2614
  };
2589
2615
  messageDraftBuilder: {
2590
2616
  firstAllowedStartPoint: string;
@@ -2596,16 +2622,23 @@ export declare function confirmLeadList(input: ConfirmLeadListInput): Promise<{
2596
2622
  workflowTableId: string | null;
2597
2623
  reviewBatchRowIds: string[];
2598
2624
  reviewBatchRowCount: number;
2625
+ copiedCampaignRowCount: number;
2599
2626
  };
2600
2627
  branchBasisFields: string[];
2601
2628
  promptRequired: string;
2602
2629
  };
2603
2630
  boundedReviewBatch: {
2604
2631
  requestedTargetLeadCount: number;
2632
+ requestedReviewBatchLimit: number;
2605
2633
  importedRowCount: number;
2606
- keptRowCount: number | null;
2634
+ keptRowCount: number;
2635
+ reviewRowCount: number;
2636
+ copiedCampaignRowCount: number;
2637
+ sourceCandidateRowCount: number;
2638
+ remainingCopyRowCount: number;
2639
+ copyStillRunning: boolean;
2607
2640
  trimmedOverflowRowCount: number;
2608
- } | undefined;
2641
+ };
2609
2642
  message: string;
2610
2643
  }>;
2611
2644
  export declare function getProviderPrompt(input: GetProviderPromptInput): string;