@sellable/mcp 0.1.153 → 0.1.155
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/agents/post-find-leads-filter-scout.md +6 -6
- package/agents/post-find-leads-message-scout.md +12 -11
- package/agents/source-scout-linkedin-engagement.md +3 -3
- package/agents/source-scout-prospeo-contact.md +3 -3
- package/agents/source-scout-sales-nav.md +3 -3
- package/dist/tools/cells.js +1 -1
- package/dist/tools/leads.d.ts +1 -0
- package/dist/tools/leads.js +51 -24
- package/dist/tools/navigation.js +2 -2
- package/dist/tools/prompts.js +7 -7
- package/dist/tools/readiness.js +2 -2
- package/dist/tools/rubrics.js +1 -1
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +52 -21
- package/skills/create-campaign-v2/SKILL.md +48 -47
- package/skills/create-campaign-v2/SOUL.md +4 -4
- package/skills/create-campaign-v2/core/auto-execute.README.md +9 -9
- package/skills/create-campaign-v2/core/flow.v2.json +84 -19
- package/skills/create-campaign-v2/core/policy.md +1 -1
- package/skills/create-campaign-v2/references/approval-gate-framing.md +2 -2
- package/skills/create-campaign-v2/references/filter-leads.md +11 -11
- package/skills/create-campaign-v2/references/final-handoff-contract.md +4 -4
- package/skills/create-campaign-v2/references/sample-validation-loop.md +8 -8
- package/skills/create-campaign-v2/references/step-13-import-leads.md +9 -9
- package/skills/create-campaign-v2/references/step-15-re-cascade.md +2 -2
- package/skills/create-campaign-v2/references/watch-guide-narration.md +15 -15
- package/skills/create-campaign-v2-tail/SKILL.md +27 -27
- package/skills/create-rubric/SKILL.md +1 -1
- package/skills/find-leads/SKILL.md +2 -2
- package/skills/providers/prospeo.md +1 -1
- package/skills/providers/sales-nav.md +1 -1
- package/skills/providers/signal-discovery.md +7 -7
|
@@ -17,8 +17,8 @@ table.
|
|
|
17
17
|
## MANDATORY TOOL ORDER (read this BEFORE any tail step)
|
|
18
18
|
|
|
19
19
|
Every tail run MUST call these tools in this exact order. The tail is
|
|
20
|
-
**
|
|
21
|
-
the
|
|
20
|
+
**initial-slice cascade-driven**: you kick off Enrich Prospect only for
|
|
21
|
+
the initial campaign-table execution slice, and the workflow engine chains DNC Check →
|
|
22
22
|
ICP Score → Passes Rubric → Generate Message automatically. Your job is
|
|
23
23
|
to START the bounded cascade, WAIT until filter results land, OBSERVE message
|
|
24
24
|
generation as soon as one row passes, and stop for review.
|
|
@@ -26,13 +26,13 @@ Do NOT manually run rubric-check, enrich, or message-generation
|
|
|
26
26
|
tools — the cascade already does them.
|
|
27
27
|
|
|
28
28
|
```text
|
|
29
|
-
Step 13 — materialize source list + confirm
|
|
29
|
+
Step 13 — materialize source list + confirm initial campaign slice
|
|
30
30
|
materialize/reuse approved source with campaignOfferId
|
|
31
31
|
import_leads(source-list target; SalesNav/Prospeo default ~1000, Signal Discovery default ~1500 engagers)
|
|
32
32
|
wait_for_lead_list_ready
|
|
33
33
|
confirm_lead_list(reviewBatchLimit=15)
|
|
34
34
|
wait_for_campaign_table_ready # campaign table exists
|
|
35
|
-
get_rows_minimal # read
|
|
35
|
+
get_rows_minimal # read initial campaign-table execution slice
|
|
36
36
|
update_campaign(currentStep=filter-choice)
|
|
37
37
|
|
|
38
38
|
Post-import main thread
|
|
@@ -42,10 +42,10 @@ Post-import main thread
|
|
|
42
42
|
keep the watched app on Filter Leads after rubrics are saved
|
|
43
43
|
while on Filter Leads, show the message template recommendation from the background Message Draft Builder
|
|
44
44
|
after approve-message, update_campaign_brief writes `## Approved Message Template` with `{{...}}` tokens
|
|
45
|
-
only then start the
|
|
45
|
+
only then start the initial-slice cascade
|
|
46
46
|
|
|
47
|
-
Step 14 — kick
|
|
48
|
-
queue_cells(cellIds=<first 15
|
|
47
|
+
Step 14 — kick initial-slice cascade + observe campaign rows
|
|
48
|
+
queue_cells(cellIds=<first 15 campaign-table execution-slice Enrich Prospect cells only>) <-- starts bounded chain
|
|
49
49
|
wait_for_campaign_table_ready # wait until sample cascade starts returning filter results
|
|
50
50
|
get_rows_minimal # read passesRubric + message cell status per row
|
|
51
51
|
wait_for_rubric_results(minPassedCount=1, includeRows=false)
|
|
@@ -75,7 +75,7 @@ Step 16 — awaiting-user-greenlight
|
|
|
75
75
|
update_campaign(senderIds=[selectedSenderId], currentStep=sequence)
|
|
76
76
|
attach_recommended_sequence({ campaignId, currentStep: "send" }) # tier-aware: premium/SN -> If Open Profile->INMAIL_OPEN, else INVITE->accepted->DM
|
|
77
77
|
if the attach response did not move the UI: update_campaign(currentStep=send)
|
|
78
|
-
re-surface watchUrl +
|
|
78
|
+
re-surface watchUrl + campaign setup orientation + final launch choices
|
|
79
79
|
STOP. DO NOT call start_campaign. DO NOT move to running without explicit launch greenlight.
|
|
80
80
|
```
|
|
81
81
|
|
|
@@ -128,10 +128,10 @@ Message` column's http_request writes those cells via the cascade.
|
|
|
128
128
|
any are pending, call `queue_cells` on those generateMessageCellIds
|
|
129
129
|
and wait. If rows truly won't message, ESCALATE.
|
|
130
130
|
- You MAY NOT advance past Step 13 without calling `queue_cells` on
|
|
131
|
-
the
|
|
131
|
+
the initial-slice Enrich Prospect cells. Without it, every downstream
|
|
132
132
|
cell stays `pending` and the campaign ships empty.
|
|
133
|
-
- You MAY NOT queue enrichment for rows outside the configured
|
|
134
|
-
|
|
133
|
+
- You MAY NOT queue enrichment for rows outside the configured internal
|
|
134
|
+
execution slice before the user approves expansion. Full-list enrichment/message
|
|
135
135
|
generation is a credit-spend decision and must happen after the user
|
|
136
136
|
has reviewed the sample.
|
|
137
137
|
|
|
@@ -165,8 +165,8 @@ Entered from the lead-source confirmation path, with
|
|
|
165
165
|
import milestone.
|
|
166
166
|
|
|
167
167
|
> Reminder: every provider search you run from this point forward — the
|
|
168
|
-
>
|
|
169
|
-
>
|
|
168
|
+
> campaign setup source rerun in Step 13, any expansion search after the
|
|
169
|
+
> initial slice, alternate-lane probes, account-based reruns, and operator
|
|
170
170
|
> follow-ups — MUST include `campaignOfferId`. This applies to
|
|
171
171
|
> `search_prospeo`, `search_sales_nav`, `search_apollo`,
|
|
172
172
|
> `search_signals`, and any other provider search tool added later.
|
|
@@ -220,9 +220,9 @@ reviewBatchLimit: 15 })`. Do not call `import_leads` for this
|
|
|
220
220
|
`domainFilterId`; run a campaign-associated Prospeo people search with
|
|
221
221
|
`campaignOfferId`, provider prompt preflight, and that `domainFilterId`;
|
|
222
222
|
then import with `targetLeadCount` set to the approved source-list target
|
|
223
|
-
(default about 1,000). The first
|
|
224
|
-
|
|
225
|
-
|
|
223
|
+
(default about 1,000). The first copied campaign rows are the internal
|
|
224
|
+
execution slice; the full confirmed source list is copied into the campaign
|
|
225
|
+
for later expansion.
|
|
226
226
|
Persist or recover materialized IDs on resume: `leadListId`,
|
|
227
227
|
`domainFilterId`, `searchId`, `selectedLeadListId`, `workflowTableId`, and
|
|
228
228
|
imported row IDs. If the source file changed after preview, or an existing lead list
|
|
@@ -263,10 +263,10 @@ searchId, targetLeadCount: 1000 })`.
|
|
|
263
263
|
3. `wait_for_lead_list_ready` when a provider import job exists, then
|
|
264
264
|
`confirm_lead_list`. Persist both identifiers: `selectedLeadListId` remains
|
|
265
265
|
the source list and `workflowTableId` is the campaign table.
|
|
266
|
-
4. `wait_for_campaign_table_ready` until the
|
|
266
|
+
4. `wait_for_campaign_table_ready` until the initial campaign-table execution slice rows are
|
|
267
267
|
available in the campaign table.
|
|
268
|
-
5. Call `get_rows_minimal({ tableId: workflowTableId })` and confirm the
|
|
269
|
-
15-row
|
|
268
|
+
5. Call `get_rows_minimal({ tableId: workflowTableId })` and confirm the
|
|
269
|
+
15-row internal execution slice is present. Do not queue cells in Step 13.
|
|
270
270
|
6. If the import returns zero usable leads, ESCALATE per
|
|
271
271
|
`references/escalation-ladder.md` (hard fail).
|
|
272
272
|
7. `update_campaign({ campaignId, currentStep: "filter-choice" })`.
|
|
@@ -288,7 +288,7 @@ Do not route to a visible `validate-sample` step. Full decision tree lives in
|
|
|
288
288
|
`references/sample-validation-loop.md`.
|
|
289
289
|
|
|
290
290
|
**Step 14 starts the bounded fit cascade, then observes it.** Step 13 imported
|
|
291
|
-
the
|
|
291
|
+
the internal execution slice only. After `save_rubrics`, Step 14 queues the initial-slice
|
|
292
292
|
Enrich Prospect cells, waits until filter results start landing, then moves to
|
|
293
293
|
message observation as soon as one row passes and approved-template message
|
|
294
294
|
generation is ready. Step 15 opens review as soon as one passing generated message
|
|
@@ -351,9 +351,9 @@ Signals underfloor results), then offer revise-filter only if the imported rows
|
|
|
351
351
|
look close to ICP but the rubric is too strict. This prevents customer-visible
|
|
352
352
|
loops where the agent keeps asking to retry the same weak source.
|
|
353
353
|
|
|
354
|
-
When the
|
|
354
|
+
When the internal slice passes the projected-pass floor, call
|
|
355
355
|
`update_campaign({ campaignId, currentStep: "auto-execute-messaging" })`
|
|
356
|
-
and orient the user that messaging will complete for the
|
|
356
|
+
and orient the user that messaging will complete for the initial campaign rows only.
|
|
357
357
|
|
|
358
358
|
## Step 15: auto-execute-messaging
|
|
359
359
|
|
|
@@ -367,7 +367,7 @@ flow through the column pipeline: `Enrich Prospect` →
|
|
|
367
367
|
`DNC Check` → `ICP Score` → `Passes Rubric` → `Generate Message`.
|
|
368
368
|
Each column's http_request auto-fires when its upstream dependency
|
|
369
369
|
completes AND passes gate (e.g. `Passes Rubric === true` before
|
|
370
|
-
`Generate Message`). Your job in Step 15 is to WAIT for the
|
|
370
|
+
`Generate Message`). Your job in Step 15 is to WAIT for the initial-slice
|
|
371
371
|
cascade to reach `Generate Message` for rows that passed ICP, and verify
|
|
372
372
|
the output — not to generate messages manually.
|
|
373
373
|
|
|
@@ -536,14 +536,14 @@ runs.
|
|
|
536
536
|
|
|
537
537
|
## Tail Hard Rules
|
|
538
538
|
|
|
539
|
-
- Source-list materialization and
|
|
539
|
+
- Source-list materialization and initial-slice confirmation happen in Step 13,
|
|
540
540
|
not during atomic mint.
|
|
541
541
|
- Step 13 materializes/reuses the approved source with `campaignOfferId` before
|
|
542
542
|
import. Do not import a legacy campaignless Signal source until selected posts
|
|
543
543
|
exist on the campaign.
|
|
544
|
-
- Full-list expansion happens only after the
|
|
545
|
-
first enrichment/scoring pass must stay capped to the
|
|
546
|
-
|
|
544
|
+
- Full-list expansion happens only after the initial campaign setup proves out.
|
|
545
|
+
The first enrichment/scoring pass must stay capped to the internal
|
|
546
|
+
campaign-table execution slice.
|
|
547
547
|
- The tail NEVER calls `start_campaign` on its own.
|
|
548
548
|
- The tail NEVER auto-revises leads. Brief revision is autonomous; lead
|
|
549
549
|
revision is always operator-gated.
|
|
@@ -51,7 +51,7 @@ 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
|
|
54
|
+
- `mcp__sellable__get_rows_minimal` - Read initial campaign-table execution-slice cell IDs
|
|
55
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
|
|
|
@@ -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
|
-
- `reviewBatchLimit: 15` for the
|
|
165
|
+
- `reviewBatchLimit: 15` for the internal campaign-table execution slice
|
|
166
166
|
9. For campaign-builder flows, `confirm_lead_list` owns the watched move to
|
|
167
|
-
`filter-choice` after the
|
|
167
|
+
`filter-choice` after the initial campaign-table execution slice 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 })`
|
|
@@ -67,7 +67,7 @@ search_prospeo({
|
|
|
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 `reviewBatchLimit: 15` to copy confirmed rows into the campaign table and use the first 15 as the
|
|
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 internal campaign-table execution slice.
|
|
71
71
|
- `import_leads` owns the watched move to `confirm-lead-list` after a lead list/job exists.
|
|
72
72
|
- `confirm_lead_list` owns the watched move to `filter-choice` after confirmed campaign rows exist.
|
|
73
73
|
- Post-confirm readback order is required:
|
|
@@ -381,7 +381,7 @@ User: "Save it"
|
|
|
381
381
|
- `confirm_lead_list` - Copy confirmed lead list into campaign table
|
|
382
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 campaign rows exist; process only the
|
|
384
|
+
Owns the filter-choice beat after campaign rows exist; process only the internal campaign-table execution slice until later approvals
|
|
385
385
|
</mcp_tools>
|
|
386
386
|
|
|
387
387
|
<limits>
|
|
@@ -47,8 +47,8 @@ number of engagers fetched. If a selected post has 1,200 visible engagers and
|
|
|
47
47
|
the source list lands at 71 rows, read that as 71 headline-passing inserted
|
|
48
48
|
rows, not as "only 71 engagers were scraped." Do not reject a completed
|
|
49
49
|
non-empty source list solely because inserted rows are below the raw engager
|
|
50
|
-
target; confirm/copy it for
|
|
51
|
-
|
|
50
|
+
target; confirm/copy it for campaign setup, then decide whether to add more
|
|
51
|
+
posts or switch lanes based on source quality and scale.
|
|
52
52
|
|
|
53
53
|
</harvest_scrape_contract>
|
|
54
54
|
|
|
@@ -480,13 +480,13 @@ selections, headlineICPCriteria })`, then call
|
|
|
480
480
|
targetEngagerCount, maxPostsToScrape })` for the approved
|
|
481
481
|
source-capacity plan without asking for another yes/no gate. Then
|
|
482
482
|
`confirm_lead_list({ reviewBatchLimit: 15 })` copies confirmed source rows into
|
|
483
|
-
the campaign table and returns the
|
|
484
|
-
the source-candidate target with the
|
|
483
|
+
the campaign table and returns the internal campaign-table execution slice. Do not confuse
|
|
484
|
+
the source-candidate target with the execution-slice size.
|
|
485
485
|
If the completed source scrape comes back below the approved source-candidate
|
|
486
486
|
target but has usable rows, still call `confirm_lead_list` so the completed
|
|
487
|
-
source list is copied into the campaign and the
|
|
487
|
+
source list is copied into the campaign and the initial setup slice can run.
|
|
488
488
|
Treat the shortfall as a scale warning: add more approved posts or move to Sales
|
|
489
|
-
Nav only after
|
|
489
|
+
Nav only after source quality proves the lane is too thin or off-ICP.
|
|
490
490
|
|
|
491
491
|
The promotion/select step is required campaign state. Use post IDs from the
|
|
492
492
|
current campaign-scoped search result, not stale IDs copied from a source review
|
|
@@ -541,7 +541,7 @@ Then run post-confirm routing in this order:
|
|
|
541
541
|
leads (e.g., "Does this look right? Should I import leads now?").
|
|
542
542
|
`create-campaign-v2` tail flow: if the user already approved the source
|
|
543
543
|
decision, that approval is the import confirmation for the source list and
|
|
544
|
-
|
|
544
|
+
internal campaign setup slice; do not ask again.
|
|
545
545
|
6. If confirmation exists, call `import_leads`. If not, refine
|
|
546
546
|
selections/criteria and ask again.
|
|
547
547
|
7. When the lead list finishes and the user confirms it looks good, call
|