@sellable/mcp 0.1.64 → 0.1.66
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/package.json +1 -1
- package/skills/create-campaign-v2/SKILL.md +35 -7
- package/skills/create-campaign-v2/core/flow.v2.json +36 -16
- package/skills/create-campaign-v2/core/policy.md +1 -1
- package/skills/create-campaign-v2/references/lead-validation-preview.md +9 -1
- package/skills/find-leads/SKILL.md +8 -4
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@ visibility: internal
|
|
|
9
9
|
<role>
|
|
10
10
|
You are the create-campaign-v2 orchestrator. Your job is to execute the
|
|
11
11
|
configured `core/flow.v2.json` state machine from scratch: (1) interview the
|
|
12
|
-
user and create `brief
|
|
12
|
+
user and create `brief.md`, (2) validate the chained Phase 84 draft artifacts,
|
|
13
13
|
(3) run a message-review gate, show the user an approval packet and commit
|
|
14
14
|
gate, and (4) if the user
|
|
15
15
|
approves, atomically mint a real `CampaignOffer` and hand off to the bounded
|
|
@@ -34,8 +34,8 @@ The JSON flow is the source of truth for stage order, `requiredArtifacts`,
|
|
|
34
34
|
replace them.
|
|
35
35
|
|
|
36
36
|
Each stage writes its own artifact into the draft directory before the next
|
|
37
|
-
stage starts. `brief
|
|
38
|
-
|
|
37
|
+
stage starts. `brief.md` is the single customer-facing brief and canonical
|
|
38
|
+
downstream campaign thesis input.
|
|
39
39
|
|
|
40
40
|
After validation artifacts are complete, show the user a commit gate with 6
|
|
41
41
|
choices (approve / revise-brief / revise-leads / revise-rubric /
|
|
@@ -51,7 +51,6 @@ Validated draft directory:
|
|
|
51
51
|
|
|
52
52
|
```text
|
|
53
53
|
.sellable/create-campaign-v2/drafts/{workspace-slug}/{campaign-slug}/
|
|
54
|
-
brief-v1.md
|
|
55
54
|
brief.md
|
|
56
55
|
lead-review.md
|
|
57
56
|
lead-sample.json
|
|
@@ -362,6 +361,10 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
|
|
|
362
361
|
Approval options should refer to what the user just read, e.g. `Approve this
|
|
363
362
|
brief`, `Revise target`, `Revise offer/proof`, and `Other / custom`.
|
|
364
363
|
Include an `Open artifact:` link to `brief.md` before the approval question.
|
|
364
|
+
The visible brief must come before local persistence chrome. After the brief
|
|
365
|
+
is synthesized, render the approval-ready brief in chat before running visible
|
|
366
|
+
`mkdir`, `Write`, artifact-copy, or similar local draft setup. File/folder
|
|
367
|
+
creation is not the user's value moment; the brief is.
|
|
365
368
|
|
|
366
369
|
- After the brief is approved or auto-confirmed, show the next progress line:
|
|
367
370
|
`Cool. Now I'm going to find people who are both a good fit and likely to
|
|
@@ -390,13 +393,13 @@ should test for this campaign. Those can run in parallel and usually take
|
|
|
390
393
|
|
|
391
394
|
- In hosted/rehearsal runs, `Bash` is only for safe local draft-directory
|
|
392
395
|
housekeeping before approval: `mkdir`, `ls`, `find`, `test`, `pwd`, `echo`,
|
|
393
|
-
|
|
396
|
+
or `cat` inside the repo. Do not use
|
|
394
397
|
Bash to run interpreters/scripts (`python`, `node`, `npm`, `pnpm`, `yarn`,
|
|
395
398
|
`npx`), call APIs, query databases, inspect prompt dumps, run git, or
|
|
396
399
|
synthesize artifact content. Use `Read`/`Write`/`Edit` for artifact files and
|
|
397
400
|
MCP tools for product actions.
|
|
398
|
-
- `brief
|
|
399
|
-
|
|
401
|
+
- `brief.md` is the single user-facing brief and stable downstream thesis
|
|
402
|
+
source.
|
|
400
403
|
- `lead-review.md` and `lead-sample.json` are the required outputs of `find leads`.
|
|
401
404
|
- `lead-filter.md` is the primary output of `filter leads`.
|
|
402
405
|
- `rubric.json` is optional and secondary to `lead-filter.md`.
|
|
@@ -758,6 +761,14 @@ user-facing lead review. The visible response must include:
|
|
|
758
761
|
|
|
759
762
|
- `Lead source decision`
|
|
760
763
|
- `Recommendation`
|
|
764
|
+
- `Primary source and filters` with the concrete source recipe the agent would
|
|
765
|
+
use if approved. For Sales Nav, name the actual role/title, company-size,
|
|
766
|
+
geography, industry/account, and activity filters. For Signals, name the
|
|
767
|
+
selected post set. For Prospeo, name the account/domain and title recipe.
|
|
768
|
+
- `Runner-up sources` with the second-best choice and why it lost. Make the
|
|
769
|
+
tradeoff explicit, e.g. Sales Nav = clearer scale and fit control, Signals =
|
|
770
|
+
warmer but smaller/noisier, Prospeo = broader account coverage but weaker
|
|
771
|
+
LinkedIn intent.
|
|
761
772
|
- `Why it won`
|
|
762
773
|
- `Quick numbers` as bullet points, with one provider/source angle per bullet.
|
|
763
774
|
Each bullet must include raw volume, sampled fit rate as `n/N`, estimated
|
|
@@ -772,6 +783,17 @@ user-facing lead review. The visible response must include:
|
|
|
772
783
|
- `Tradeoff`
|
|
773
784
|
- `Open artifact: lead-review.md`
|
|
774
785
|
|
|
786
|
+
The first sentence of the visible decision must make the actual choice clear:
|
|
787
|
+
`I recommend {primary source} using {exact filter/source recipe}. The runner-up
|
|
788
|
+
is {source} because {reason}.` Do not make the user infer the decision from
|
|
789
|
+
numbers alone.
|
|
790
|
+
|
|
791
|
+
If you ask for lead-source approval, the question and choices must name the
|
|
792
|
+
source decision. Prefer `Approve Sales Nav with founder/CEO filters, or use
|
|
793
|
+
warmer Signals posts instead?` over `Approve this lead source?`. Option labels
|
|
794
|
+
must be concrete, such as `Approve Sales Nav filters`, `Use warmer Signals
|
|
795
|
+
posts`, `Try Prospeo/account search`, and `Revise source`.
|
|
796
|
+
|
|
775
797
|
Do not skip or discard Signals based only on raw post count or vibes. If
|
|
776
798
|
Signals was considered, show the post-level math in chat first so the user can
|
|
777
799
|
see which LinkedIn posts would be scraped, how many engagers each has, how many
|
|
@@ -779,6 +801,12 @@ sampled engagers looked like good fits, and roughly how many usable prospects
|
|
|
779
801
|
each post can produce. If no engagers could be fetched, say that explicitly and
|
|
780
802
|
lower confidence instead of presenting a precise estimate.
|
|
781
803
|
|
|
804
|
+
For Signals, default to sampling a few promising posts first rather than trying
|
|
805
|
+
to prove the entire source can scale before the user sees evidence. Pick 3-5
|
|
806
|
+
fresh, high-density posts when available, sample engagers, show fit rate, then
|
|
807
|
+
state how many additional posts could be added/scraped if that first sample is
|
|
808
|
+
good but volume is low.
|
|
809
|
+
|
|
782
810
|
Keep discarded paths, full sample rows, and `lead-sample.json` details in
|
|
783
811
|
artifacts. Do not show raw filesystem paths unless links cannot be created or
|
|
784
812
|
the user asks.
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
],
|
|
13
13
|
"events": [
|
|
14
14
|
"bootstrap_complete",
|
|
15
|
-
"
|
|
15
|
+
"brief_ready",
|
|
16
16
|
"source_intake_ready",
|
|
17
17
|
"user_brief_confirmed",
|
|
18
18
|
"lead_review_ready",
|
|
@@ -139,7 +139,7 @@
|
|
|
139
139
|
"campaignBrief": "~1-2 min"
|
|
140
140
|
},
|
|
141
141
|
"forbiddenWording": [
|
|
142
|
-
"brief
|
|
142
|
+
"brief.md",
|
|
143
143
|
"lead-review.md",
|
|
144
144
|
"lead-sample.json",
|
|
145
145
|
"message-validation.md"
|
|
@@ -150,14 +150,24 @@
|
|
|
150
150
|
"target": "create-campaign-brief"
|
|
151
151
|
},
|
|
152
152
|
{
|
|
153
|
-
"action": "
|
|
154
|
-
"
|
|
153
|
+
"action": "render_brief_preview_before_artifact_write",
|
|
154
|
+
"requiredVisibleContent": [
|
|
155
|
+
"Campaign brief",
|
|
156
|
+
"Decision",
|
|
157
|
+
"Target",
|
|
158
|
+
"Pain",
|
|
159
|
+
"Offer",
|
|
160
|
+
"Proof",
|
|
161
|
+
"Lead plan",
|
|
162
|
+
"Risks",
|
|
163
|
+
"After approval"
|
|
164
|
+
],
|
|
165
|
+
"mustRunBefore": ["write_artifact", "Bash", "mkdir"],
|
|
166
|
+
"chatRenderRule": "After synthesizing the brief, render the approval-ready brief in chat before any visible local folder creation, file write, or artifact copy. The user should see useful brief content before local persistence chrome. Do not ask the user to approve a hidden artifact."
|
|
155
167
|
},
|
|
156
168
|
{
|
|
157
|
-
"action": "
|
|
158
|
-
"
|
|
159
|
-
"to": "brief.md",
|
|
160
|
-
"reason": "brief.md remains the canonical downstream artifact name"
|
|
169
|
+
"action": "write_artifact",
|
|
170
|
+
"artifact": "brief.md"
|
|
161
171
|
},
|
|
162
172
|
{
|
|
163
173
|
"action": "ask_source_intake_after_strategy_batch",
|
|
@@ -183,7 +193,7 @@
|
|
|
183
193
|
}
|
|
184
194
|
],
|
|
185
195
|
"requiredArtifacts": [],
|
|
186
|
-
"producesArtifacts": ["brief
|
|
196
|
+
"producesArtifacts": ["brief.md"],
|
|
187
197
|
"allowedTools": [
|
|
188
198
|
"get_subskill_prompt",
|
|
189
199
|
"get_subskill_asset",
|
|
@@ -211,9 +221,9 @@
|
|
|
211
221
|
"start_campaign"
|
|
212
222
|
],
|
|
213
223
|
"watchRequired": false,
|
|
214
|
-
"waitFor": ["
|
|
224
|
+
"waitFor": ["brief_ready", "confirm_with_user"],
|
|
215
225
|
"transitions": {
|
|
216
|
-
"
|
|
226
|
+
"brief_ready": "brief-review",
|
|
217
227
|
"confirm_with_user": "brief-review"
|
|
218
228
|
},
|
|
219
229
|
"optionalProducesArtifacts": ["lead-source-intake.json"]
|
|
@@ -224,7 +234,7 @@
|
|
|
224
234
|
"onEnter": [
|
|
225
235
|
{
|
|
226
236
|
"action": "show_brief_summary",
|
|
227
|
-
"artifact": "brief
|
|
237
|
+
"artifact": "brief.md"
|
|
228
238
|
},
|
|
229
239
|
{
|
|
230
240
|
"action": "render_brief_approval_checkpoint",
|
|
@@ -243,7 +253,7 @@
|
|
|
243
253
|
"then I will find good-fit leads"
|
|
244
254
|
],
|
|
245
255
|
"minimumVisibleBriefDetail": "full_readable_brief_before_question",
|
|
246
|
-
"requiredArtifactLinks": ["brief
|
|
256
|
+
"requiredArtifactLinks": ["brief.md"],
|
|
247
257
|
"artifactLinkTiming": "before_approval_question",
|
|
248
258
|
"avoidQuestionWhenOnlyUsefulAnswerIs": "looks good"
|
|
249
259
|
},
|
|
@@ -257,7 +267,7 @@
|
|
|
257
267
|
}
|
|
258
268
|
}
|
|
259
269
|
],
|
|
260
|
-
"requiredArtifacts": ["brief
|
|
270
|
+
"requiredArtifacts": ["brief.md"],
|
|
261
271
|
"producesArtifacts": [],
|
|
262
272
|
"allowedTools": [
|
|
263
273
|
"AskUserQuestion",
|
|
@@ -326,7 +336,7 @@
|
|
|
326
336
|
"artifacts": ["lead-review.md", "lead-sample.json"]
|
|
327
337
|
}
|
|
328
338
|
],
|
|
329
|
-
"requiredArtifacts": ["brief
|
|
339
|
+
"requiredArtifacts": ["brief.md"],
|
|
330
340
|
"producesArtifacts": ["lead-review.md", "lead-sample.json"],
|
|
331
341
|
"allowedTools": [
|
|
332
342
|
"get_subskill_prompt",
|
|
@@ -387,6 +397,8 @@
|
|
|
387
397
|
"renderInlineSections": [
|
|
388
398
|
"## Lead source decision",
|
|
389
399
|
"Recommendation",
|
|
400
|
+
"Primary source and filters",
|
|
401
|
+
"Runner-up sources",
|
|
390
402
|
"Why it won",
|
|
391
403
|
"Quick numbers",
|
|
392
404
|
"Signal keyword lanes",
|
|
@@ -419,6 +431,13 @@
|
|
|
419
431
|
"expected reply-rate range",
|
|
420
432
|
"confidence note"
|
|
421
433
|
],
|
|
434
|
+
"sourceDecisionRequiredFields": [
|
|
435
|
+
"primary source",
|
|
436
|
+
"exact Sales Nav filters or source recipe",
|
|
437
|
+
"runner-up source",
|
|
438
|
+
"why runner-up lost",
|
|
439
|
+
"what approval means"
|
|
440
|
+
],
|
|
422
441
|
"signalsInlineTableRequiredFields": [
|
|
423
442
|
"keyword lane",
|
|
424
443
|
"timeframe",
|
|
@@ -436,7 +455,7 @@
|
|
|
436
455
|
"artifactLinkTiming": "before_next_step_or_revision_question",
|
|
437
456
|
"doNotCompressToSummaryOnly": false,
|
|
438
457
|
"doNotRenderArtifactLinksOnly": true,
|
|
439
|
-
"chatRenderRule": "Show a slim rendered-Markdown decision summary only, never a fenced code block. Use indexed sections and short bullets: recommendation, why it won, Quick numbers with one provider/source angle per bullet, raw volume, sampled fit rate as n/N, estimated good-fit range after cleanup, expected reply rate range, 3-5 representative sample leads, and one tradeoff. If Signals was searched or considered, include two compact inline Markdown tables before the recommendation is treated as final: Signal keyword lanes with keyword lane, timeframe, posts found, and finalist posts reviewed; and LinkedIn posts sampled with post URL/title, author/topic, age, engagers, sampled engagers, good fits as n/N, estimated usable prospects per post, and use/discard decision. Do not skip or discard Signals based only on raw post count or vibes; show the post-level math first, or explicitly say no engagers could be fetched and lower confidence. Keep discarded paths, full sample rows, and lead-sample.json details in lead-review.md. Do not show plain filesystem paths unless links cannot be created."
|
|
458
|
+
"chatRenderRule": "Show a slim rendered-Markdown decision summary only, never a fenced code block. The first sentence must make the decision explicit: 'I recommend {primary source} using {exact filter/source recipe}. The runner-up is {source} because {reason}.' Use indexed sections and short bullets: recommendation, Primary source and filters, Runner-up sources, why it won, Quick numbers with one provider/source angle per bullet, raw volume, sampled fit rate as n/N, estimated good-fit range after cleanup, expected reply rate range, 3-5 representative sample leads, and one tradeoff. If Signals was searched or considered, include two compact inline Markdown tables before the recommendation is treated as final: Signal keyword lanes with keyword lane, timeframe, posts found, and finalist posts reviewed; and LinkedIn posts sampled with post URL/title, author/topic, age, engagers, sampled engagers, good fits as n/N, estimated usable prospects per post, and use/discard decision. Default to selecting a few promising Signals posts for the first sample instead of trying to prove full Signals scale up front; if the sample is good but volume is low, say how many more posts to add/scrape next. Do not skip or discard Signals based only on raw post count or vibes; show the post-level math first, or explicitly say no engagers could be fetched and lower confidence. Keep discarded paths, full sample rows, and lead-sample.json details in lead-review.md. Do not show plain filesystem paths unless links cannot be created."
|
|
440
459
|
},
|
|
441
460
|
{
|
|
442
461
|
"action": "render_post_lead_parallel_progress",
|
|
@@ -452,6 +471,7 @@
|
|
|
452
471
|
},
|
|
453
472
|
{
|
|
454
473
|
"action": "ask_continue_revise_or_confirm_only_if_needed",
|
|
474
|
+
"approvalQuestionRule": "If asking the user, the question and options must name the concrete decision. Prefer: 'Approve Sales Nav with {filters}, or use warmer Signals instead?' over 'Approve this lead source?' Option labels must name the source choice, such as 'Approve Sales Nav filters', 'Use warmer Signals posts', 'Try Prospeo/account search', and 'Revise source'.",
|
|
455
475
|
"autoContinueWhen": {
|
|
456
476
|
"status": "confirmed",
|
|
457
477
|
"confidenceIn": ["high", "medium"],
|
|
@@ -88,6 +88,12 @@ Use a compact markdown report with these sections:
|
|
|
88
88
|
|
|
89
89
|
- Best Path: {provider or provider sequence}
|
|
90
90
|
- Why It Won: {volume + reply-likelihood + fit rationale}
|
|
91
|
+
- Primary Source and Filters: {exact source recipe; include Sales Nav
|
|
92
|
+
role/title, company-size, geography, industry/account, and activity filters
|
|
93
|
+
when Sales Nav wins}
|
|
94
|
+
- Runner-Up Sources: {second-best source and why it lost}
|
|
95
|
+
- Approval Meaning: approving this source means {what will be sampled/imported
|
|
96
|
+
next}
|
|
91
97
|
|
|
92
98
|
## Expected LinkedIn Funnel
|
|
93
99
|
|
|
@@ -111,7 +117,9 @@ what lets the user see which keyword lanes produced enough fresh post inventory.
|
|
|
111
117
|
Include this section whenever Signals was searched or considered. Do not skip or
|
|
112
118
|
discard Signals based only on raw post count or vibes; show the post-level math
|
|
113
119
|
first. This table is the evidence for how many posts to scrape, including
|
|
114
|
-
estimated usable prospects per post.
|
|
120
|
+
estimated usable prospects per post. Default to sampling a few promising posts
|
|
121
|
+
first, then state how many more similar posts to add/scrape if the fit rate is
|
|
122
|
+
good but volume is low.
|
|
115
123
|
|
|
116
124
|
| Post | Author / topic | Age | Engagers | Sampled engagers | Good fits | Estimated usable prospects per post | Use / discard |
|
|
117
125
|
| ---- | -------------- | --- | -------- | ---------------- | --------- | ----------------------------------- | ------------- |
|
|
@@ -267,10 +267,12 @@ Use first when the value is in conversation opportunity, competitor engagers, co
|
|
|
267
267
|
- Favor ICP-fit conversation density over raw post volume.
|
|
268
268
|
- Capture counts, false-positive patterns, and notable examples.
|
|
269
269
|
- If Signals is materially in the running, do not stop at post-level quality alone.
|
|
270
|
-
- Pick
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
270
|
+
- Pick a few promising posts by default so the user can see real post-level
|
|
271
|
+
evidence. Start with 3-5 fresh, high-density posts when available; if only
|
|
272
|
+
1-2 genuinely strong posts exist, sample those and say the lane needs more
|
|
273
|
+
inventory. If the sampled pass rate is good but the projected pool is below
|
|
274
|
+
target, recommend adding/scraping more similar posts as the expansion lever
|
|
275
|
+
before discarding Signals.
|
|
274
276
|
- Sample a representative first page only, scoring the first 25-40 engagers across the chosen posts against a rough yes/no headline rubric or `headlineICPCriteria`.
|
|
275
277
|
- Use headline and display-name cues only for the spot-check sample; do not enrich people during this phase.
|
|
276
278
|
- Base `estimatedReachableLeads` on the sampled engager pass rate, not only on a guessed discount from post themes.
|
|
@@ -290,6 +292,8 @@ Use first when the value is in conversation opportunity, competitor engagers, co
|
|
|
290
292
|
title, post age, engager count, sampled engagers, good fits as `n/N`,
|
|
291
293
|
estimated usable prospects per post, and use/discard decision. This table is
|
|
292
294
|
the evidence for how many posts to scrape; raw post count alone is not enough.
|
|
295
|
+
If the first few posts look good but do not produce enough volume, say how
|
|
296
|
+
many more posts to add/scrape next instead of treating the lane as failed.
|
|
293
297
|
- If you cannot fetch engagers in the current runtime, say the estimate is inferred and lower confidence.
|
|
294
298
|
- If Signals is too sparse, too noisy, or clearly below campaign scale after the spot check, fall back to `Sales Nav` rather than forcing a weak conversation-led lane.
|
|
295
299
|
|