@sellable/mcp 0.1.54 → 0.1.56
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/dist/tools/auth.js +2 -2
- package/dist/tools/leads.d.ts +56 -0
- package/dist/tools/leads.js +66 -2
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +56 -76
- package/skills/create-campaign-v2/SKILL.md +108 -262
- package/skills/create-campaign-v2/SOUL.md +32 -60
- package/skills/create-campaign-v2/core/flow.v2.json +24 -20
- package/skills/create-campaign-v2/core/policy.md +0 -2
- package/skills/create-campaign-v2/references/approval-gate-framing.md +23 -31
- package/skills/create-campaign-v2/references/validation-criteria.md +0 -14
- package/skills/create-campaign-v2/references/watch-link-handoff.md +1 -1
- package/skills/find-leads/SKILL.md +7 -0
- package/skills/providers/sales-nav.md +16 -0
|
@@ -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-v1.md` is
|
|
38
|
-
the
|
|
37
|
+
stage starts. `brief-v1.md` is the customer-facing brief output; `brief.md` is
|
|
38
|
+
the canonical 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 /
|
|
@@ -78,25 +78,17 @@ Validated draft directory:
|
|
|
78
78
|
Claude Code, this is `AskUserQuestion`. In Codex, this is
|
|
79
79
|
`request_user_input` (enabled in Default mode by
|
|
80
80
|
`[features].default_mode_request_user_input = true`, not available in
|
|
81
|
-
`codex exec`). Treat them as equivalent approval gates and persist the
|
|
82
|
-
draft artifacts after the user answers. Use this structured gate for
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
the visible choices as shortcuts, not a rigid multiple-choice survey. Every
|
|
88
|
-
setup question must allow a custom typed answer. In Codex,
|
|
89
|
-
`request_user_input` adds a freeform Other path; in Claude, include an
|
|
90
|
-
`Other / custom` option. Keep setup intake to two panels because Codex
|
|
91
|
-
supports at most three questions per panel: target/offer/proof first, lead
|
|
92
|
-
source second. Do not use checkbox/radio multi-select language like "pick
|
|
93
|
-
one", "multi-select", or "choose all that apply" for these setup questions.
|
|
94
|
-
If an interactive
|
|
81
|
+
`codex exec`). Treat them as equivalent approval/intake gates and persist the
|
|
82
|
+
same draft artifacts after the user answers. Use this structured gate only for
|
|
83
|
+
multiple-choice decisions or approval gates. Never use it to collect open text
|
|
84
|
+
input like LinkedIn URLs, company domains, notes, pasted context, campaign
|
|
85
|
+
ideas, or feedback. For open text, ask in normal chat and wait for the user to
|
|
86
|
+
paste the value. If an interactive
|
|
95
87
|
Codex session does not expose `request_user_input`, do not silently degrade to
|
|
96
88
|
a plain chat question; stop and tell the user:
|
|
97
89
|
|
|
98
90
|
```text
|
|
99
|
-
I need Codex’s quick question panel
|
|
91
|
+
I need Codex’s quick question panel to collect campaign inputs and approvals cleanly.
|
|
100
92
|
|
|
101
93
|
It isn’t enabled in this Codex session yet. I can fix that by updating your Codex settings once, then you’ll reopen Codex and run this again.
|
|
102
94
|
|
|
@@ -112,7 +104,7 @@ Validated draft directory:
|
|
|
112
104
|
$sellable:create-campaign
|
|
113
105
|
|
|
114
106
|
After that, I’ll confirm who we’re launching for, then ask the setup questions
|
|
115
|
-
|
|
107
|
+
and start the campaign brief.
|
|
116
108
|
```
|
|
117
109
|
|
|
118
110
|
If they decline, tell them to switch to Plan/collaboration mode and rerun
|
|
@@ -144,27 +136,7 @@ Validated draft directory:
|
|
|
144
136
|
- Any time the user is reviewing a list or decision, use rendered Markdown with
|
|
145
137
|
short indexed sections and bullets. Do not use label-plus-paragraph blocks
|
|
146
138
|
like `Key numbers:` followed by one long paragraph. Do not use fenced code
|
|
147
|
-
blocks for review surfaces.
|
|
148
|
-
|
|
149
|
-
```text
|
|
150
|
-
## Lead source decision
|
|
151
|
-
|
|
152
|
-
**1. Chosen source**
|
|
153
|
-
- Signals, with a strict filter
|
|
154
|
-
|
|
155
|
-
**2. Quick numbers**
|
|
156
|
-
- **Signals:** 491 posts reviewed. 9/40 sampled engagers fit. Estimate:
|
|
157
|
-
180-260 usable leads.
|
|
158
|
-
- **Sales Nav:** 2,598 active profiles. Preview was broader and noisier.
|
|
159
|
-
|
|
160
|
-
**3. Sample leads**
|
|
161
|
-
- Joyjit Ghosh — Co-Founder, Prospectee.io
|
|
162
|
-
- Ashish Rai — Founder & CEO, ReachHQ
|
|
163
|
-
|
|
164
|
-
**4. Tradeoff**
|
|
165
|
-
- More context, but the filter needs to cut consultants and creators.
|
|
166
|
-
```
|
|
167
|
-
|
|
139
|
+
blocks for review surfaces.
|
|
168
140
|
- Do not treat the active Sellable workspace as the campaign subject. The
|
|
169
141
|
workspace only tells you where the campaign will be saved. Before buyer, CTA,
|
|
170
142
|
proof, or source questions, identify two things:
|
|
@@ -186,9 +158,7 @@ Validated draft directory:
|
|
|
186
158
|
or most recent company, then ask a structured confirmation question:
|
|
187
159
|
|
|
188
160
|
```text
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
I found {matched sender} connected here.
|
|
161
|
+
I’m ready to build this in {workspace}. I found {matched sender} connected here.
|
|
192
162
|
|
|
193
163
|
Is that you, and is this campaign for {company}?
|
|
194
164
|
```
|
|
@@ -219,11 +189,11 @@ Validated draft directory:
|
|
|
219
189
|
company they want to send on behalf of so you can research context:
|
|
220
190
|
|
|
221
191
|
```text
|
|
222
|
-
|
|
192
|
+
I’m ready to build this in {workspace}.
|
|
223
193
|
|
|
224
|
-
First, paste your LinkedIn URL or the company website
|
|
225
|
-
|
|
226
|
-
source.
|
|
194
|
+
First, paste your LinkedIn URL or the company website you want to send on
|
|
195
|
+
behalf of. I’ll use that to understand the company before we pick the target,
|
|
196
|
+
offer, proof, and lead source.
|
|
227
197
|
```
|
|
228
198
|
|
|
229
199
|
If there is no strong sender match, do not show a structured choice that says
|
|
@@ -233,7 +203,7 @@ Validated draft directory:
|
|
|
233
203
|
customer-facing shape should be:
|
|
234
204
|
|
|
235
205
|
```text
|
|
236
|
-
|
|
206
|
+
I’m ready to build this in {workspace}.
|
|
237
207
|
|
|
238
208
|
First, what’s your LinkedIn URL? If you’d rather start from the company, paste
|
|
239
209
|
the company website instead.
|
|
@@ -243,8 +213,6 @@ Validated draft directory:
|
|
|
243
213
|
`fetch_linkedin_profile` and infer the user's current or most recent company
|
|
244
214
|
from the profile. For a company website, call `fetch_company` when possible,
|
|
245
215
|
otherwise one web lookup.
|
|
246
|
-
Before the lookup, use concise progress copy:
|
|
247
|
-
`Got it — I’ll look it up and confirm the sender + company.`
|
|
248
216
|
|
|
249
217
|
If `list_senders` did not already run, call it once after the lookup to see
|
|
250
218
|
whether the fetched user appears to match a connected sender. If there is a
|
|
@@ -263,29 +231,23 @@ Validated draft directory:
|
|
|
263
231
|
Sender options should include connected sender names if available, `same as
|
|
264
232
|
me`, `I’ll paste a different sender profile`, and `Other / custom`.
|
|
265
233
|
|
|
266
|
-
After the user confirms the subject and sender, run one
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
lookups: `fetch_company` on a LinkedIn company URL from the profile when
|
|
272
|
-
available; `WebFetch` for the company website/domain when available; otherwise
|
|
273
|
-
one `WebSearch` for `{company} official website` or `{company} product`. If
|
|
274
|
-
parallel tool calls are unavailable, do the single highest-confidence lookup
|
|
275
|
-
first and continue. Do not run full company research, source discovery, Sales
|
|
276
|
-
Nav, Prospeo, Signals, or multi-query browsing here. The goal is a fast 15-30
|
|
277
|
-
second context read so the four setup questions feel specific. If identity is
|
|
278
|
-
still unavailable, use neutral/custom intake options instead of guessed
|
|
279
|
-
vertical-specific options.
|
|
234
|
+
After the user confirms the subject and sender, run one lightweight company
|
|
235
|
+
lookup if it has not already run, then ask the campaign setup questions. The
|
|
236
|
+
setup questions should use the confirmed company context so they do not feel
|
|
237
|
+
generic. If identity is still unavailable, use neutral/custom intake options
|
|
238
|
+
instead of guessed vertical-specific options.
|
|
280
239
|
|
|
281
240
|
- Before the identity gate, use this customer-facing shape:
|
|
282
241
|
|
|
283
242
|
```text
|
|
284
|
-
|
|
243
|
+
I’m ready to build the campaign in {workspace}.
|
|
285
244
|
|
|
286
|
-
First I’ll check
|
|
287
|
-
ask for your LinkedIn URL or company website
|
|
288
|
-
offer, proof,
|
|
245
|
+
First I’ll check whether you already have a connected LinkedIn account here.
|
|
246
|
+
If I can’t confirm it, I’ll ask for your LinkedIn URL or company website and
|
|
247
|
+
use that to understand the company before we choose the target, offer, proof,
|
|
248
|
+
and lead source.
|
|
249
|
+
|
|
250
|
+
Then I’ll turn that into a campaign brief for you to approve before anything is created.
|
|
289
251
|
```
|
|
290
252
|
|
|
291
253
|
- Fast Intake Mode is mandatory for hosted/rehearsal net-new runs. Ask the
|
|
@@ -293,28 +255,22 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
|
|
|
293
255
|
that first packet, the first assistant turn may only call
|
|
294
256
|
`bootstrap_create_campaign`, load this workflow prompt with
|
|
295
257
|
`get_subskill_prompt({ subskillName: "create-campaign-v2" })`, optionally run
|
|
296
|
-
one lightweight identity lookup, then
|
|
297
|
-
identity is confirmed, run the bounded lightweight company-context pass above
|
|
298
|
-
before generating buyer/offer/proof/source options. If the user
|
|
258
|
+
one lightweight identity lookup, then use the structured question gate. If the user
|
|
299
259
|
supplied a company website/domain, call exactly one of `fetch_company`,
|
|
300
260
|
`WebFetch`, or `WebSearch` to identify what the company actually does before
|
|
301
261
|
generating setup options. If the user supplied a LinkedIn profile URL, call
|
|
302
262
|
`fetch_linkedin_profile` before generating setup options. Do not infer the
|
|
303
263
|
product category from the company name alone. If no domain, website, LinkedIn
|
|
304
|
-
profile, or sender identity is supplied, the first
|
|
305
|
-
the launch identity before buyer/offer/source. Before that first
|
|
306
|
-
do not run source discovery, Sales Nav, Prospeo,
|
|
307
|
-
Edit, Glob, Grep, full company research, or
|
|
264
|
+
profile, or sender identity is supplied, the first structured question gate
|
|
265
|
+
must ask for the launch identity before buyer/offer/source. Before that first
|
|
266
|
+
structured question gate, do not run source discovery, Sales Nav, Prospeo,
|
|
267
|
+
Signals, Bash, Read, Write, Edit, Glob, Grep, full company research, or
|
|
308
268
|
draft-directory inspection/creation. `list_senders` is allowed once before the
|
|
309
269
|
first identity gate as a quiet token/sender inference shortcut, and once means
|
|
310
270
|
once: do not call it again after a LinkedIn lookup if it already ran. Do
|
|
311
271
|
draft-directory setup only after the founder answers. After launch identity is
|
|
312
|
-
confirmed, ask buyer, offer/CTA, proof, and lead source
|
|
313
|
-
|
|
314
|
-
target/offer/proof first, then lead source. Do not present these as
|
|
315
|
-
checkbox/radio multi-select gates. Use 2-3 context-specific suggested answers
|
|
316
|
-
per question as fast-start shortcuts, and rely on the freeform custom path for
|
|
317
|
-
nuanced answers.
|
|
272
|
+
confirmed, the setup packet must ask buyer, offer/CTA, proof, and lead source,
|
|
273
|
+
and all four questions must include an `Other / custom` option.
|
|
318
274
|
- After the founder answers the first strategy/source packet, explain the next
|
|
319
275
|
stage only: campaign brief creation and brief approval. Use this shape:
|
|
320
276
|
|
|
@@ -393,33 +349,7 @@ me`, `I’ll paste a different sender profile`, and `Other / custom`.
|
|
|
393
349
|
In the `Lead plan` section, do not expose internal provider shorthand as the
|
|
394
350
|
explanation. Avoid bare phrases like `signal discovery`, `founder-led GTM`,
|
|
395
351
|
`RevOps`, `outbound systems`, or `pipeline architecture` unless they are
|
|
396
|
-
translated into what the user can understand.
|
|
397
|
-
|
|
398
|
-
```text
|
|
399
|
-
I’ll start by looking for LinkedIn activity from founders and revenue leaders
|
|
400
|
-
who are talking about pipeline problems, CRM handoffs, outbound tooling, or
|
|
401
|
-
messy sales processes.
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
Do not paste the full rich brief into chat for approval unless the user asks.
|
|
405
|
-
Do not show long filesystem paths in the normal approval view. After the slim
|
|
406
|
-
brief, include only:
|
|
407
|
-
|
|
408
|
-
```text
|
|
409
|
-
Open artifact: [brief.md]
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
If clickable links cannot be created, show one compact fallback line:
|
|
413
|
-
`Trouble opening artifacts? I can show the file paths.`
|
|
414
|
-
|
|
415
|
-
The `Offer / CTA` section must name the useful thing the buyer gets by
|
|
416
|
-
replying. Do not use vague peer-call framing like `compare notes`, `swap
|
|
417
|
-
notes`, `worth chatting`, `pick your brain`, or a bare `15 minute call` unless
|
|
418
|
-
the user explicitly asks for that. A low-friction CTA is only good when the
|
|
419
|
-
object is concrete: a checklist, workflow teardown, benchmark, sample, short
|
|
420
|
-
loom, diagnostic, bottleneck map, relevant proof asset, or a working session
|
|
421
|
-
with a clear output. If the first draft produces a vague CTA, revise it before
|
|
422
|
-
showing the brief.
|
|
352
|
+
translated into what the user can understand.
|
|
423
353
|
|
|
424
354
|
After rendering that brief, ask for brief approval when there is a real
|
|
425
355
|
strategic choice or the user has not already made the direction obvious. The
|
|
@@ -460,13 +390,8 @@ should test for this campaign. Those can run in parallel and usually take
|
|
|
460
390
|
`npx`), call APIs, query databases, inspect prompt dumps, run git, or
|
|
461
391
|
synthesize artifact content. Use `Read`/`Write`/`Edit` for artifact files and
|
|
462
392
|
MCP tools for product actions.
|
|
463
|
-
- `brief-v1.md` is
|
|
464
|
-
|
|
465
|
-
current user-facing brief, and thesis source.
|
|
466
|
-
- On brief edits or revisions, update `brief.md` directly. Do not run another
|
|
467
|
-
long brief-generation pass just to create `brief-v2.md`. If version history is
|
|
468
|
-
ever needed, create it only as a cheap local copy after the edit; never spend
|
|
469
|
-
model/research time writing duplicate versions.
|
|
393
|
+
- `brief-v1.md` is the user-facing brief. `brief.md` is the stable downstream
|
|
394
|
+
input and remains the thesis source.
|
|
470
395
|
- `lead-review.md` and `lead-sample.json` are the required outputs of `find leads`.
|
|
471
396
|
- `lead-filter.md` is the primary output of `filter leads`.
|
|
472
397
|
- `rubric.json` is optional and secondary to `lead-filter.md`.
|
|
@@ -478,30 +403,29 @@ should test for this campaign. Those can run in parallel and usually take
|
|
|
478
403
|
sample rows that already look like probable good fits. It can contain rough
|
|
479
404
|
candidate messages and element tests, but it cannot select the final winner
|
|
480
405
|
and cannot override `lead-filter.md`.
|
|
481
|
-
- `message-validation.md` is the
|
|
406
|
+
- `message-validation.md` is the internal validation artifact produced by the
|
|
407
|
+
user-facing `message generation` stage.
|
|
482
408
|
- `message-review.md` and `message-review-decision.md` are the mandatory
|
|
483
409
|
message quality gate outputs between `message-validation.md` and
|
|
484
410
|
`approval-packet.md`.
|
|
485
411
|
- Run the dependency chain as a DAG: `create-campaign-brief` -> `find leads`;
|
|
486
412
|
once `lead-review.md` and `lead-sample.json` exist, run `filter leads` and
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
413
|
+
`message generation` as parallel branches from the same basis (`brief.md`,
|
|
414
|
+
`lead-review.md`, `lead-sample.json`). Approval waits for both
|
|
415
|
+
`lead-filter.md` and `message-validation.md`, then reconciles that the
|
|
490
416
|
selected message basis rows still pass the final filter.
|
|
491
|
-
- Parallel means real parallel execution, not
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
- Never say `kicking off two workstreams`, `in parallel`, or `background`
|
|
504
|
-
unless parallel branches were actually launched.
|
|
417
|
+
- Parallel means real parallel execution, not optimistic progress copy. After
|
|
418
|
+
lead review, if the host exposes Task/subagent workers and host policy allows
|
|
419
|
+
them for this user request, launch two disjoint workers: one owns
|
|
420
|
+
`lead-filter.md` and optional `rubric.json`; the other owns the user-facing
|
|
421
|
+
message generation branch and may write `message-prep.md`,
|
|
422
|
+
`message-validation.md`, and `message-review.md`. If only parallel tool
|
|
423
|
+
batching is available, batch independent tool reads/lookups only. If real
|
|
424
|
+
parallel execution is not available or not allowed, run the same DAG
|
|
425
|
+
sequentially and use honest copy: `I’ll tighten the filter first, then draft
|
|
426
|
+
the message from the same sample.` Never say `kicking off two workstreams`,
|
|
427
|
+
`in parallel`, or `background` unless parallel branches were actually
|
|
428
|
+
launched.
|
|
505
429
|
- Never run a downstream stage until the active `flow.v2.json` step's
|
|
506
430
|
`requiredArtifacts` exist.
|
|
507
431
|
- Never call a tool outside the active step's `allowedTools`, and never call a
|
|
@@ -575,37 +499,34 @@ Ask the user only when one of these is true:
|
|
|
575
499
|
packet so the founder can approve or revise the message deliberately.
|
|
576
500
|
|
|
577
501
|
When asking subjective strategy questions (buyer scope, first ask, proof
|
|
578
|
-
emphasis, tone, lead-source preference),
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
lead source in a second panel. Do not add custom options to the final six-choice
|
|
583
|
-
commit gate.
|
|
502
|
+
emphasis, tone, lead-source preference), always make it clear the user can give
|
|
503
|
+
a custom answer. Add an explicit `Other / custom` option to each subjective
|
|
504
|
+
question. Do not rely on prose like "you can add detail" as the only custom
|
|
505
|
+
path. Do not add custom options to the final six-choice commit gate.
|
|
584
506
|
Use customer-facing question wording:
|
|
585
507
|
|
|
586
|
-
- target prospects: `Who should this campaign
|
|
587
|
-
- main CTA / offer: `What
|
|
588
|
-
- proof emphasis: `
|
|
508
|
+
- target prospects: `Who should be the target prospects for this campaign? Pick one or combine.`
|
|
509
|
+
- main CTA / offer: `What should the main CTA or offer be? Pick one or combine.`
|
|
510
|
+
- proof emphasis: `Which proof point would most increase this buyer's confidence in {{company}}? Multi-select fine.`
|
|
589
511
|
- lead source: `How should we get the people for this campaign?`
|
|
590
512
|
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
the
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
contain up to 7,500 rows but only 1,000 unique domains.
|
|
513
|
+
Ask the lead-source question as the last question in the first strategy
|
|
514
|
+
batch, after buyer, offer/ask, and proof/safety are understood. Frame supplied
|
|
515
|
+
lists as optional, not required. The three visible options are exactly:
|
|
516
|
+
|
|
517
|
+
1. `Find people for me (recommended if you don't already have your own list)`
|
|
518
|
+
2. `I have a CSV of LinkedIn profiles`
|
|
519
|
+
3. `I have a CSV of company domains`
|
|
520
|
+
|
|
521
|
+
Keep `Other / custom` available for freeform answers such as a pasted list,
|
|
522
|
+
an existing Sellable lead list, or another source idea. Do not put existing
|
|
523
|
+
Sellable lead lists in the main three-option first batch; support them through
|
|
524
|
+
custom/freeform input. If the user pastes up to 100 LinkedIn profile URLs or
|
|
525
|
+
company domains, normalize the paste into a temporary local CSV and continue
|
|
526
|
+
through the matching CSV preview path. Mixed, ambiguous, malformed, or oversized
|
|
527
|
+
pastes should ask for a real CSV file instead of guessing. Uploaded CSV support
|
|
528
|
+
is larger than paste support: LinkedIn profile CSVs can contain up to 7,500
|
|
529
|
+
rows; domain CSVs can contain up to 7,500 rows but only 1,000 unique domains.
|
|
609
530
|
|
|
610
531
|
Avoid internal wording like `Which proof points should the message be allowed
|
|
611
532
|
to lean on?` because it describes the artifact, not the founder decision.
|
|
@@ -642,12 +563,31 @@ Required behavior:
|
|
|
642
563
|
- do not set `selectedLeadListId`
|
|
643
564
|
- do not create lead-list rows
|
|
644
565
|
- do not mutate DB-backed campaign state
|
|
645
|
-
- run a parallel source scout when the source is not supplied
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
566
|
+
- run a real parallel source-angle scout when the source is not supplied and at
|
|
567
|
+
least two viable source angles exist. Treat source scouting as independent
|
|
568
|
+
branches, then compare the outputs in `lead-review.md`.
|
|
569
|
+
- Branch A: Signals / active LinkedIn posts. Search relevant keyword lanes,
|
|
570
|
+
review finalist posts, fetch top-post engagers, and estimate warm-fit
|
|
571
|
+
volume.
|
|
572
|
+
- Branch B: Sales Nav / title + company filters. Run preview filters, inspect
|
|
573
|
+
preview rows, and estimate scalable-fit volume.
|
|
574
|
+
- Branch C: Prospeo / domains only when the campaign has a domain/account
|
|
575
|
+
path or the user supplied domains. Estimate email/contact scale and call out
|
|
576
|
+
weaker LinkedIn activity.
|
|
577
|
+
If the host cannot run these branches in parallel, run them sequentially and
|
|
578
|
+
do not claim they ran in parallel. If only one source angle is credible, say
|
|
579
|
+
that and run the best primary source plus one cheap fallback/quality check
|
|
580
|
+
when available. For Signals-first campaigns, search multiple Signals keyword
|
|
581
|
+
lanes and fetch top-post engagers in parallel when tool batching allows it.
|
|
582
|
+
For Sales Nav-first or Prospeo/account-first campaigns, run multiple preview
|
|
583
|
+
lanes for that provider in parallel and use Signals only as a warmth/quality
|
|
584
|
+
check when relevant
|
|
585
|
+
- after every Sales Nav preview, validate that filters actually applied before
|
|
586
|
+
using the lane in `lead-review.md`: `searchUrl` should include filters, the
|
|
587
|
+
first page should match the intended roles/companies, and the result count
|
|
588
|
+
should be plausible. If Sales Nav returns a giant unfiltered pool, drops the
|
|
589
|
+
filters, or errors after one clean retry, call it out as a provider/tool
|
|
590
|
+
issue and do not recommend Sales Nav.
|
|
651
591
|
- for Signals-first campaigns, raw post search volume is only inventory, not
|
|
652
592
|
lead volume. `492 post results` means matching LinkedIn posts found across
|
|
653
593
|
keyword lanes; it does not mean 492 prospects. The source decision must name
|
|
@@ -753,17 +693,12 @@ table with one row per selected or finalist post:
|
|
|
753
693
|
`## Evidence Snapshot` must include a compact numbers-first table:
|
|
754
694
|
|
|
755
695
|
- source lane / keyword or filter
|
|
756
|
-
- provider/source angle label, e.g. `Signals / AI outbound posts`,
|
|
757
|
-
`Sales Nav / active SaaS founders + GTM leaders`, or
|
|
758
|
-
`Prospeo / domain-filtered agencies`
|
|
759
696
|
- timeframe searched
|
|
760
697
|
- raw results found
|
|
761
698
|
- finalist posts or preview rows reviewed
|
|
762
699
|
- sampled people
|
|
763
700
|
- sampled fits, shown as `n/N (%)`
|
|
764
701
|
- estimated usable people
|
|
765
|
-
- estimated good-fit range after cleanup
|
|
766
|
-
- expected reply-rate range
|
|
767
702
|
- confidence note (`sample-backed`, `directional`, or `needs more sample`)
|
|
768
703
|
|
|
769
704
|
For Signals-first campaigns, `## Sample Leads` must group representative sample
|
|
@@ -777,11 +712,11 @@ directional range and label it `directional`, not definitive.
|
|
|
777
712
|
|
|
778
713
|
When showing `lead-review.md` to the user, render a slim decision summary in
|
|
779
714
|
chat, not the full evidence table. Use rendered Markdown directly with short
|
|
780
|
-
bullet lines; do not use fenced code blocks for the
|
|
781
|
-
The visible response must include:
|
|
715
|
+
indexed sections and bullet lines; do not use fenced code blocks for the
|
|
716
|
+
user-facing lead review. The visible response must include:
|
|
782
717
|
|
|
783
718
|
- `Lead source decision`
|
|
784
|
-
- `
|
|
719
|
+
- `Recommendation`
|
|
785
720
|
- `Why it won`
|
|
786
721
|
- `Quick numbers` as bullet points, with one provider/source angle per bullet.
|
|
787
722
|
Each bullet must include raw volume, sampled fit rate as `n/N`, estimated
|
|
@@ -794,33 +729,6 @@ Keep `## Evidence Snapshot`, selected posts, discarded paths, full sample rows,
|
|
|
794
729
|
and `lead-sample.json` details in artifacts. Do not show raw filesystem paths
|
|
795
730
|
unless links cannot be created or the user asks.
|
|
796
731
|
|
|
797
|
-
Use this chat shape for the quick-number bullets:
|
|
798
|
-
|
|
799
|
-
```text
|
|
800
|
-
**1. Quick numbers**
|
|
801
|
-
- **Signals / AI outbound posts:** 249 posts found. Sampled 40 engagers; 18/40
|
|
802
|
-
looked usable. Estimate: 100-250 good warm fits. Expected reply: 6-12%.
|
|
803
|
-
- **Sales Nav / active SaaS founders + GTM leaders:** 27,454 active profiles before
|
|
804
|
-
filtering. First 25 had 12 strong/probable fits. Estimate: 300-800 good fits
|
|
805
|
-
after title/company cleanup. Expected reply: 4-9%.
|
|
806
|
-
- **Prospeo / domain-filtered agencies:** 1,000+ likely contacts if we need scale,
|
|
807
|
-
but weaker LinkedIn activity. Estimate: 500-1,000 contacts. Expected reply:
|
|
808
|
-
2-5%.
|
|
809
|
-
```
|
|
810
|
-
|
|
811
|
-
After the lead source is set, use this progress copy before the parallel
|
|
812
|
-
filter/message work:
|
|
813
|
-
|
|
814
|
-
```text
|
|
815
|
-
Lead source is set.
|
|
816
|
-
|
|
817
|
-
I’m kicking off two workstreams now:
|
|
818
|
-
1. Tighten the fit filter so we only reach out to the right people.
|
|
819
|
-
2. Draft the first message from the approved brief and real sample leads.
|
|
820
|
-
|
|
821
|
-
These can run in parallel and usually take ~2-3 min.
|
|
822
|
-
```
|
|
823
|
-
|
|
824
732
|
For supplied profile CSVs and existing lead lists, `lead-review.md` must not
|
|
825
733
|
describe a generic TAM estimate or pretend the rows came from Sales Nav/Prospeo
|
|
826
734
|
discovery. For supplied domain/account lists, explain that domains are account
|
|
@@ -891,31 +799,6 @@ Required behavior:
|
|
|
891
799
|
- `Recommendation`
|
|
892
800
|
- `Implementation Details`
|
|
893
801
|
|
|
894
|
-
When showing the filter result in chat, render a slim summary before moving to
|
|
895
|
-
message review. Use rendered Markdown, indexed sections, and short bullets:
|
|
896
|
-
|
|
897
|
-
```text
|
|
898
|
-
## Lead filter
|
|
899
|
-
|
|
900
|
-
**1. Keep**
|
|
901
|
-
- {role/title family}
|
|
902
|
-
- {company/context family}
|
|
903
|
-
|
|
904
|
-
**2. Exclude**
|
|
905
|
-
- {false-positive family}
|
|
906
|
-
- {false-positive family}
|
|
907
|
-
|
|
908
|
-
**3. Why**
|
|
909
|
-
- {sample-backed reason}
|
|
910
|
-
|
|
911
|
-
**4. Expected impact**
|
|
912
|
-
- {1 line}
|
|
913
|
-
|
|
914
|
-
Open artifact: lead-filter.md
|
|
915
|
-
```
|
|
916
|
-
|
|
917
|
-
Keep production rubric details and `rubric.json` internals in the artifact.
|
|
918
|
-
|
|
919
802
|
When `rubric.json` is emitted, it must use the production rubric shape, not a
|
|
920
803
|
custom sidecar schema:
|
|
921
804
|
|
|
@@ -956,43 +839,6 @@ Continue chunked-read until `hasMore=false`. Treat all chunks as one prompt load
|
|
|
956
839
|
|
|
957
840
|
Do NOT proceed to Step 4 (message review gate) without loading and following the full generate-messages workflow. `message-validation.md` must prove the full workflow ran (all required sections present + raw sendable Selected Winner) before `message-review.md` can recommend `approve-message`. If the message review or approval packet is ready but the generate-messages prompt was not retrieved in this run, route back to message-generation instead of asking the commit gate.
|
|
958
841
|
|
|
959
|
-
When showing message review in chat, lead with one fully filled sample message,
|
|
960
|
-
not the tokenized template. Use rendered Markdown, indexed sections, and short
|
|
961
|
-
bullets around the sample. The visible response must include:
|
|
962
|
-
|
|
963
|
-
- `Message review`
|
|
964
|
-
- `Subject`
|
|
965
|
-
- `Sample message` with no `{{tokens}}`
|
|
966
|
-
- `Why it should work`
|
|
967
|
-
- `Concern`
|
|
968
|
-
- `Recommendation`
|
|
969
|
-
- `Open artifact: message-review.md`
|
|
970
|
-
|
|
971
|
-
Keep tokenized templates, token fill basis, rendered examples, good/bad token
|
|
972
|
-
fill examples, validation notes, and `message-validation.md` details in
|
|
973
|
-
artifacts.
|
|
974
|
-
|
|
975
|
-
## Step 4: Final Approval Packet
|
|
976
|
-
|
|
977
|
-
When showing the final approval packet, render a slim "ready to create" summary
|
|
978
|
-
in chat. Use rendered Markdown, indexed sections, and short bullets. The visible
|
|
979
|
-
response must include:
|
|
980
|
-
|
|
981
|
-
- `Ready to create campaign`
|
|
982
|
-
- `Campaign`
|
|
983
|
-
- `Target` with concrete role/title names
|
|
984
|
-
- `Lead source` with one key metric
|
|
985
|
-
- `Filter`
|
|
986
|
-
- `Sample message` with one fully filled sample and no `{{tokens}}`
|
|
987
|
-
- `What approval creates`
|
|
988
|
-
- `Safety`
|
|
989
|
-
- `Open artifact: approval-packet.md`
|
|
990
|
-
|
|
991
|
-
Keep tokenized templates, evidence tables, rubrics, validation notes, and long
|
|
992
|
-
implementation details in `approval-packet.md`. Do not include
|
|
993
|
-
sequence/settings in the final approval packet; sequence attachment and launch
|
|
994
|
-
settings happen after campaign creation and before the later greenlight.
|
|
995
|
-
|
|
996
842
|
## Tail (MANDATORY TOOL ORDER + Steps 13-16 + Threshold Trips + Hard Rules)
|
|
997
843
|
|
|
998
844
|
The full tail detail (~17k chars: MANDATORY TOOL ORDER, auto-execute-leads, validate-sample loop, auto-execute-messaging, awaiting-user-greenlight, threshold-trip logging, tail hard rules) lives in a dedicated on-demand subskill to keep this entry prompt fast to load.
|