@sellable/mcp 0.1.154 → 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/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/tools/cells.js +1 -1
- package/dist/tools/leads.d.ts +1 -0
- package/dist/tools/leads.js +38 -20
- 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 +26 -21
- package/skills/create-campaign-v2/SKILL.md +36 -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 +7 -7
- 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
- package/skills/research/config.json +9 -0
|
@@ -70,8 +70,10 @@ CampaignOffer state and the watch link are the customer-facing source of truth.
|
|
|
70
70
|
Disk artifacts are optional debug/UAT diagnostics; normal customer runs should
|
|
71
71
|
not create, link, or surface local draft files unless the user explicitly asks
|
|
72
72
|
for them. Resume, gating, and handoff read campaign state first. The
|
|
73
|
-
watchable campaign exists after the short brief;
|
|
74
|
-
|
|
73
|
+
watchable campaign exists after the short brief; source import copies the
|
|
74
|
+
confirmed list into the campaign, then an internal first campaign-table
|
|
75
|
+
execution slice configures filters and messages. After that, the user chooses
|
|
76
|
+
whether to use filters or skip.
|
|
75
77
|
When filters are chosen, save rubrics, get filter approval, then wait for
|
|
76
78
|
message-template approval before enrichment/filtering or Generate Message cells.
|
|
77
79
|
Use Template is the default message path; AI Generated is only an explicit
|
|
@@ -159,15 +161,17 @@ precision, and referral paths, but it does not provide hiring-by-role filters;
|
|
|
159
161
|
say that distinction plainly in the source-plan gate.
|
|
160
162
|
|
|
161
163
|
After scouting, ask for a second approval on the concrete source action. For
|
|
162
|
-
Signal Discovery, name how many selected posts will be scraped
|
|
163
|
-
engager/source-candidate volume
|
|
164
|
-
|
|
164
|
+
Signal Discovery, name how many selected posts will be scraped and the
|
|
165
|
+
target engager/source-candidate volume. For Sales Nav or Prospeo, name the
|
|
166
|
+
specific approved import lane and source lead count. Keep the internal
|
|
167
|
+
15-row campaign-table execution slice separate from source sampling.
|
|
165
168
|
|
|
166
169
|
Do not call `import_leads` or `confirm_lead_list` until this second approval is
|
|
167
170
|
granted.
|
|
168
171
|
|
|
169
172
|
For Sales Nav and Prospeo, the second gate approves materializing the source
|
|
170
|
-
lead list, not importing only the
|
|
173
|
+
lead list, not importing only the internal execution slice. Use the provider
|
|
174
|
+
first-page/source sample
|
|
171
175
|
to calculate projected good fits: sampled fit rate after conservative cleanup,
|
|
172
176
|
raw pool size, source target, and expected good-fit count. If the projected
|
|
173
177
|
good-fit pool is below the campaign target, keep refining/broadening filters
|
|
@@ -175,7 +179,7 @@ granted.
|
|
|
175
179
|
with a source-list `targetLeadCount` around 1,000 by default (provider cap is
|
|
176
180
|
internal when the raw pool is larger). Only after the source list is ready
|
|
177
181
|
should `confirm_lead_list({ reviewBatchLimit: 15 })` copy confirmed rows into
|
|
178
|
-
the campaign table and return the
|
|
182
|
+
the campaign table and return the initial campaign-table execution slice rows.
|
|
179
183
|
|
|
180
184
|
For Signal Discovery, the customer-facing approval card must use the exact
|
|
181
185
|
action shape "Approve scraping N Signal Discovery posts?" and the chat summary
|
|
@@ -187,15 +191,16 @@ should be a compact `## Source Recommendation` block with:
|
|
|
187
191
|
- planning floor: continue with Signal Discovery only when sampled/projected
|
|
188
192
|
fit is at least 10% after cleanup; below that, move to Sales Nav recent
|
|
189
193
|
activity instead of scraping noisy engagers
|
|
190
|
-
-
|
|
191
|
-
into the campaign and process
|
|
194
|
+
- campaign setup checkpoint: after the source list exists, copy confirmed source rows
|
|
195
|
+
into the campaign and internally process the first execution slice for fit and message setup
|
|
192
196
|
- a selected-post table with post author/topic, why it fits, and visible
|
|
193
197
|
engagement
|
|
194
198
|
- total visible pool and estimated good-fit pool
|
|
195
|
-
- first pass: build the source list
|
|
196
|
-
campaign
|
|
199
|
+
- first pass: build the source list and copy all confirmed source rows into the
|
|
200
|
+
campaign; the campaign table then internally processes its first execution
|
|
201
|
+
slice before scaling
|
|
197
202
|
- fallback: switch to Sales Nav recent activity if sampled/projected fit falls
|
|
198
|
-
below 10%, or if the
|
|
203
|
+
below 10%, or if the source sample is vendor-heavy, agency-heavy, or off-ICP
|
|
199
204
|
|
|
200
205
|
When the user has not supplied a source and multiple source angles are viable,
|
|
201
206
|
scout those angles as independent branches when the host can actually do it:
|
|
@@ -288,7 +293,7 @@ After every `update_campaign({ campaignId, currentStep })`, use
|
|
|
288
293
|
`get_campaign_navigation_state` when available as a compact orientation check:
|
|
289
294
|
match the saved campaign state to the expected watch-link step, explain the
|
|
290
295
|
current state in one sentence, and only then continue. Sender selection belongs
|
|
291
|
-
at Settings after message approval and
|
|
296
|
+
at Settings after message approval and campaign setup validation. After message
|
|
292
297
|
validation, use Settings to help the user connect or select a LinkedIn sender.
|
|
293
298
|
Explain Slack reply review before launch. After sender selection, attach the
|
|
294
299
|
recommended sequence and move the watched UI to Send. Do not start the campaign
|
|
@@ -393,7 +398,7 @@ the brief. This is only the client-prospect/bootstrap identity for
|
|
|
393
398
|
Do not call `mcp__sellable__list_senders`, `mcp__sellable__get_sender`, or
|
|
394
399
|
surface connected/missing sender state during setup, brief, source, filter, or
|
|
395
400
|
message review. Sender availability belongs only to the Settings/final launch
|
|
396
|
-
handoff after message approval and the
|
|
401
|
+
handoff after message approval and the campaign setup validation slice.
|
|
397
402
|
|
|
398
403
|
If the invocation or user answer includes an existing `clientProspectId`, keep
|
|
399
404
|
it as the preferred `create_campaign` identity input. If it includes a LinkedIn
|
|
@@ -677,13 +682,13 @@ updates.
|
|
|
677
682
|
until `hasMore=false`. Message review requires Message Draft Builder output:
|
|
678
683
|
do not draft from a checklist, local markdown artifact, or parent-thread
|
|
679
684
|
intuition. Use campaign state, campaign brief content, selected source state, and
|
|
680
|
-
|
|
685
|
+
initial campaign-table execution slice rows as the source of truth; do not read stale local
|
|
681
686
|
markdown such as `message-validation.md`, inspect the database directly, or
|
|
682
687
|
synthesize local validation artifacts from general knowledge.
|
|
683
688
|
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
684
689
|
watch link and see useful setup state immediately. Materialize the approved
|
|
685
|
-
source list, copy confirmed rows into the campaign, and process
|
|
686
|
-
first
|
|
690
|
+
source list, copy confirmed rows into the campaign, and internally process the
|
|
691
|
+
first campaign-table execution slice after the source is attached to the campaign; do not
|
|
687
692
|
queue workflow cells, attach a sequence, or start until saved filters and the
|
|
688
693
|
message template/token rules are approved. When filters are chosen, immediately
|
|
689
694
|
call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
|
|
@@ -691,7 +696,7 @@ updates.
|
|
|
691
696
|
After rubrics save, keep Filter Rules visible for approval; after approval,
|
|
692
697
|
move to Filter Leads and wait there for the background message recommendation.
|
|
693
698
|
If filters are skipped, move to Messages/message review. Queue the bounded
|
|
694
|
-
|
|
699
|
+
campaign-table execution-slice `enrichCellId` cells only after message approval. Move to
|
|
695
700
|
Messages only after at least one review row passes and one generated message
|
|
696
701
|
is ready.
|
|
697
702
|
Do not ask the user to approve the brief before shell creation unless they
|
|
@@ -700,14 +705,14 @@ updates.
|
|
|
700
705
|
`mcp__sellable__update_campaign({ campaignId, currentStep })` before major
|
|
701
706
|
visible work so the user can watch progress in the app: `create-offer` for
|
|
702
707
|
the brief, `pick-provider` or the selected provider step while sourcing,
|
|
703
|
-
`filter-choice` after the
|
|
708
|
+
`filter-choice` after source rows are copied into the campaign table, `create-icp-rubric` as soon
|
|
704
709
|
as filters are chosen and while saved filters await approval,
|
|
705
710
|
`apply-icp-rubric` after filter approval and message approval while bounded
|
|
706
711
|
enrichment/filter scoring runs, `validate-sample` only as a recovery/legacy
|
|
707
712
|
observation state,
|
|
708
|
-
`auto-execute-messaging` after at least one row passes and
|
|
713
|
+
`auto-execute-messaging` after at least one row passes and initial campaign-row
|
|
709
714
|
messages are being generated or reviewed, `awaiting-user-greenlight` only
|
|
710
|
-
after generated
|
|
715
|
+
after generated campaign-row messages are approved, `settings` for sender
|
|
711
716
|
selection, `sequence` after sender attach, and `send` once the recommended
|
|
712
717
|
sequence is attached. Do not advance the step backward.
|
|
713
718
|
7. Keep `selectedLeadListId` as the source list and `workflowTableId` as the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-campaign-v2
|
|
3
|
-
description: Execute the compact JSON-gated shell-first campaign flow: resolve campaign identity, create a watchable CampaignOffer shell with the brief, attach and approve the source, copy the confirmed source list into the campaign, process the first
|
|
3
|
+
description: Execute the compact JSON-gated shell-first campaign flow: resolve campaign identity, create a watchable CampaignOffer shell with the brief, attach and approve the source, copy the confirmed source list into the campaign, internally process the first campaign-table execution slice, persist rubrics and approved message template, validate the first passing generated message, then hand off to Settings, sequence, and start.
|
|
4
4
|
visibility: internal
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -40,8 +40,10 @@ for debug output.
|
|
|
40
40
|
4. Create the watchable campaign shell with `create_campaign` and the v1 brief.
|
|
41
41
|
5. Surface the direct watch link.
|
|
42
42
|
6. Choose and approve the lead source.
|
|
43
|
-
7. Materialize the approved source list
|
|
44
|
-
use
|
|
43
|
+
7. Materialize the approved source list and confirm/copy it into the campaign.
|
|
44
|
+
Internally use the first 15 imported campaign-table rows as the initial
|
|
45
|
+
execution slice for filter/message setup; do not present that as source
|
|
46
|
+
sampling.
|
|
45
47
|
8. Ask whether to use filters or skip them.
|
|
46
48
|
9. Persist lead rubrics when filters are enabled, then ask approval while the
|
|
47
49
|
app remains on Filter Rules.
|
|
@@ -74,7 +76,7 @@ offers are plausible, ask one campaign-focus choice before buyer/offer/proof.
|
|
|
74
76
|
|
|
75
77
|
Do not call `list_senders`, do not infer the campaign from connected senders,
|
|
76
78
|
and do not show a sender picker during setup. Sender availability belongs only
|
|
77
|
-
to Settings after message approval and
|
|
79
|
+
to Settings after message approval and campaign setup validation.
|
|
78
80
|
|
|
79
81
|
Use `research-sender` for concise identity/proof research and call
|
|
80
82
|
`complete_sender_research` before shell creation. If WebSearch is unavailable,
|
|
@@ -178,33 +180,27 @@ reasonable refinement, move to Prospeo. Prospeo is the terminal fallback; if it
|
|
|
178
180
|
also falls below 10%, tighten the ICP/source direction instead of inventing
|
|
179
181
|
another provider.
|
|
180
182
|
|
|
181
|
-
After scouting, show a second approval gate for the concrete source action.
|
|
182
|
-
Signal Discovery,
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
the source
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
approval to materialize the source list with
|
|
197
|
-
`targetLeadCount` around 1,000 source contacts by default (use the provider cap
|
|
198
|
-
internally when the raw pool is larger). After that source list is ready,
|
|
199
|
-
`confirm_lead_list({ reviewBatchLimit: 15 })` copies confirmed source rows into
|
|
200
|
-
the campaign table and returns the first 15 review/process row ids for fit and
|
|
201
|
-
message review.
|
|
183
|
+
After scouting, show a second approval gate for the concrete source action.
|
|
184
|
+
For Signal Discovery, state selected-post count, target engager/source-candidate
|
|
185
|
+
volume, internal campaign-table execution-slice size, cleanup risk, and fallback;
|
|
186
|
+
label the approval like "Approve scraping 3 Signal Discovery posts?" For Sales
|
|
187
|
+
Nav or Prospeo, name the specific search/import lane and source lead count. Do
|
|
188
|
+
not call `import_leads` or `confirm_lead_list` until this gate is approved.
|
|
189
|
+
|
|
190
|
+
For Sales Nav and Prospeo, do not ask to import only the internal 15-row
|
|
191
|
+
campaign-table execution slice at the source-action gate. First-page samples are
|
|
192
|
+
source math: sampled fit after cleanup, projected good-fit prospects, and
|
|
193
|
+
whether the lane clears the campaign target. Once it clears, ask approval to
|
|
194
|
+
materialize the source list with `targetLeadCount` around 1,000 source contacts
|
|
195
|
+
by default. After that, `confirm_lead_list({ reviewBatchLimit: 15 })` copies
|
|
196
|
+
confirmed source rows into the campaign table and returns the initial
|
|
197
|
+
campaign-table execution slice row ids for filter and message setup.
|
|
202
198
|
|
|
203
199
|
After the user approves this concrete source-action gate, do not show the
|
|
204
200
|
Source Recommendation again and do not ask another source approval question.
|
|
205
201
|
Acknowledge once, then call `import_leads` immediately with the approved source
|
|
206
202
|
math. For Sales Nav/Prospeo, pass `targetLeadCount` as the approved source-list
|
|
207
|
-
export count, not the
|
|
203
|
+
export count, not the campaign execution-slice size. For Signal Discovery, pass
|
|
208
204
|
`provider: "signal-discovery"`, `targetEngagerCount`, `maxPostsToScrape`, and
|
|
209
205
|
`confirmed: true`; the tool owns moving the watch UI to source-list progress
|
|
210
206
|
after a lead-list/job id exists.
|
|
@@ -221,32 +217,24 @@ Use Signal Discovery first.
|
|
|
221
217
|
**Working assumption:** ~20% of raw post engagers become good-fit prospects<br>
|
|
222
218
|
**Engagers needed:** ~1,500 raw engagers<br>
|
|
223
219
|
**Planning floor:** continue only when sampled/projected fit is at least 10% after cleanup; below that, switch to Sales Nav recent activity<br>
|
|
224
|
-
**
|
|
220
|
+
**Campaign setup checkpoint:** after the source list exists, copy the entire confirmed source list into the campaign and internally process only the first execution slice for filter and message setup<br>
|
|
225
221
|
|
|
226
222
|
### Selected posts
|
|
227
223
|
|
|
228
|
-
|
|
229
|
-
| ---------------- | ----------------------------------------------- | -----------------: |
|
|
230
|
-
| Dylan Power | Claude outbound system | ~1,571 |
|
|
231
|
-
| Fivos Aresti | Replacing Clay outbound with Claude Code | ~734 |
|
|
232
|
-
| Divyanshi Sharma | LinkedIn lead-gen system built with Claude Code | ~508 |
|
|
224
|
+
Show author/topic, why it fits, and visible engagement.
|
|
233
225
|
|
|
234
|
-
**Total visible pool:** ~2,
|
|
235
|
-
**Estimated good-fit pool at 20%:** ~560 prospects before
|
|
226
|
+
**Total visible pool:** ~2,800 engagers<br>
|
|
227
|
+
**Estimated good-fit pool at 20%:** ~560 prospects before cleanup
|
|
236
228
|
|
|
237
229
|
### Recommendation
|
|
238
230
|
|
|
239
231
|
Approve scraping these 3 posts.
|
|
240
232
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
233
|
+
**First pass:** build the source list and copy all confirmed source rows into
|
|
234
|
+
the campaign. The campaign table then internally processes its first execution
|
|
235
|
+
slice so filters and generated copy are configured before scaling.
|
|
244
236
|
|
|
245
|
-
**
|
|
246
|
-
campaign, then process only the first 15 rows so we can inspect quality before
|
|
247
|
-
scaling.
|
|
248
|
-
|
|
249
|
-
**Fallback:** if sampled/projected fit falls below 10%, or if the review batch
|
|
237
|
+
**Fallback:** if sampled/projected fit falls below 10%, or if the source sample
|
|
250
238
|
is too vendor-heavy, agency-heavy, or off-ICP, switch to Sales Nav recent
|
|
251
239
|
activity.
|
|
252
240
|
```
|
|
@@ -258,7 +246,8 @@ authorizes. For Sales Nav/Prospeo it must also show source export math:
|
|
|
258
246
|
`rawResultCount`, `sampledFitRate`, conservative projected fit rate,
|
|
259
247
|
`targetLeadCount` for the source list, and projected good-fit count from that
|
|
260
248
|
export. If projected good-fit count is below target, the recommendation is to
|
|
261
|
-
refine or broaden filters, not to run
|
|
249
|
+
refine or broaden filters, not to run the internal campaign-table execution slice
|
|
250
|
+
as if it were source sampling.
|
|
262
251
|
|
|
263
252
|
Supplied profile CSVs, company/domain CSVs, pasted domains, and existing
|
|
264
253
|
Sellable lead lists are supported, but keep provider mechanics out of the first
|
|
@@ -271,7 +260,7 @@ After `confirm_lead_list` copies a non-empty confirmed source into the campaign
|
|
|
271
260
|
filter-choice question immediately. Do not call
|
|
272
261
|
`get_post_find_leads_scout_registry`, load filter/message subskill prompts, or
|
|
273
262
|
spawn post-lead workers before that question. The only customer-facing work
|
|
274
|
-
before the question should be a short
|
|
263
|
+
before the question should be a short campaign setup summary and the choice:
|
|
275
264
|
add filters, skip filters, or revise source.
|
|
276
265
|
|
|
277
266
|
If the user chooses filters, then load the post-lead registry/reference needed
|
|
@@ -305,7 +294,7 @@ get_subskill_prompt({ subskillName: "generate-messages", offset, limit }) until
|
|
|
305
294
|
No shortcut message instructions are valid. If the host cannot launch the
|
|
306
295
|
agent, the parent fallback must run the same full prompt from live campaign
|
|
307
296
|
state before drafting. Do not render message review until
|
|
308
|
-
`messageDraftRecommendation` proves current campaign/table/
|
|
297
|
+
`messageDraftRecommendation` proves current campaign/table/execution-slice
|
|
309
298
|
`generate-messages` basis.
|
|
310
299
|
|
|
311
300
|
## Hard Gates
|
|
@@ -314,7 +303,7 @@ state before drafting. Do not render message review until
|
|
|
314
303
|
- Do not call `import_leads` or `confirm_lead_list` until the lead source is
|
|
315
304
|
approved.
|
|
316
305
|
- Do not queue enrichment, ICP scoring, filtering, or product Generate Message
|
|
317
|
-
cells until the
|
|
306
|
+
cells until the campaign-table execution slice exists and the required message/filter approvals
|
|
318
307
|
are complete.
|
|
319
308
|
- Do not call `check_rubric`; persist production rubrics with `save_rubrics`.
|
|
320
309
|
- Do not call `start_campaign` until the user explicitly confirms launch after
|
|
@@ -330,6 +319,6 @@ Load references only when needed:
|
|
|
330
319
|
- `references/lead-validation-preview.md` for legacy/debug preview shapes.
|
|
331
320
|
- `references/filter-leads.md` for rubric design and `save_rubrics` rules.
|
|
332
321
|
- `references/step-13-import-leads.md` before source copy.
|
|
333
|
-
- `references/sample-validation-loop.md` before
|
|
322
|
+
- `references/sample-validation-loop.md` before campaign setup validation.
|
|
334
323
|
- `references/final-handoff-contract.md` for Settings, sender, sequence, and
|
|
335
324
|
start.
|
|
@@ -52,8 +52,8 @@ turn anchored to that:
|
|
|
52
52
|
4. Ask for brief approval before any lead import or sending-adjacent work.
|
|
53
53
|
5. Find likely responders and approve the source.
|
|
54
54
|
6. Copy the confirmed source list into the campaign and use the first 15 rows as
|
|
55
|
-
the
|
|
56
|
-
7. Filter for fit and draft the reusable message template from the same
|
|
55
|
+
the internal campaign-table execution slice for setup.
|
|
56
|
+
7. Filter for fit and draft the reusable message template from the same slice.
|
|
57
57
|
8. Queue the bounded fit cascade from saved rubrics/run conditions only after the
|
|
58
58
|
message template is approved.
|
|
59
59
|
9. Use Settings for sender selection, sequence attach, and final launch handoff.
|
|
@@ -83,7 +83,7 @@ example, like `omit the noticed... line` or `use "operators"`. Missing data
|
|
|
83
83
|
should never produce robotic or creepy copy.
|
|
84
84
|
|
|
85
85
|
Approved token guidance is part of the campaign, not just the review. After the
|
|
86
|
-
|
|
86
|
+
initial campaign-table execution slice exists and message generation has a selected
|
|
87
87
|
template, the campaign brief should carry forward the token fill rules and examples before any
|
|
88
88
|
workflow-table cascade is queued: good fills, good omits, bad fills, fallback
|
|
89
89
|
rules, and why the bad fills are blocked.
|
|
@@ -243,7 +243,7 @@ For Signal Discovery, the second gate is not "approve source" in the abstract.
|
|
|
243
243
|
It is a concrete scrape approval: show a compact `## Source Recommendation`
|
|
244
244
|
with the ~150 good-fit prospect goal, 15% raw-engager assumption, selected-post
|
|
245
245
|
table, total visible pool, estimated good-fit pool, 10% planning floor,
|
|
246
|
-
first-pass
|
|
246
|
+
first-pass campaign setup, and fallback. The approval question should be "Approve
|
|
247
247
|
scraping N Signal Discovery posts?"
|
|
248
248
|
|
|
249
249
|
That scrape approval is single-use. Once the user approves it, do not replay
|
|
@@ -20,7 +20,7 @@ into the campaign).
|
|
|
20
20
|
|
|
21
21
|
### `import`
|
|
22
22
|
|
|
23
|
-
- **`importLimit`** —
|
|
23
|
+
- **`importLimit`** — Internal execution-slice size used after Step 13 copies the
|
|
24
24
|
confirmed source rows into the campaign. The tail MUST NOT exceed this cap
|
|
25
25
|
before the message template is approved and at least one generated passing
|
|
26
26
|
message is reviewed.
|
|
@@ -31,18 +31,18 @@ into the campaign).
|
|
|
31
31
|
|
|
32
32
|
### `sample`
|
|
33
33
|
|
|
34
|
-
- **`sampleSize`** — How many rows the validation loop pulls from the
|
|
35
|
-
|
|
34
|
+
- **`sampleSize`** — How many rows the validation loop pulls from the initial
|
|
35
|
+
campaign-table execution slice. In v2 this matches the process cap (default 15), so the
|
|
36
36
|
user sees enough real rows to judge the campaign without spending credits on
|
|
37
37
|
hundreds more.
|
|
38
38
|
- **`minProjectedPass`** — Passing-message floor required before handoff.
|
|
39
|
-
The default requires one passing example from the 15-row
|
|
39
|
+
The default requires one passing example from the 15-row internal slice.
|
|
40
40
|
Math:
|
|
41
41
|
```text
|
|
42
42
|
projectedPass = round(passInSample / sampleSize * importLimit)
|
|
43
43
|
```
|
|
44
44
|
With defaults (sampleSize=15, importLimit=15), `projectedPass` equals the
|
|
45
|
-
actual
|
|
45
|
+
actual initial-slice pass count. One passing row is exactly at the floor.
|
|
46
46
|
- **`maxRevisionRounds`** — Hard cap before escalating to the user. A
|
|
47
47
|
revision round is one full sample pass that triggered brief revision
|
|
48
48
|
and retried. On stale resume the counter does NOT reset.
|
|
@@ -50,7 +50,7 @@ into the campaign).
|
|
|
50
50
|
### `messaging`
|
|
51
51
|
|
|
52
52
|
- **`tokenContract`** — `strict` rejects unresolved/unsupported tokens
|
|
53
|
-
before handing
|
|
53
|
+
before handing generated copy to the user. `relaxed` logs warnings but
|
|
54
54
|
proceeds.
|
|
55
55
|
Default `strict` because live campaign state shouldn't ship messages
|
|
56
56
|
with unresolved templating.
|
|
@@ -125,9 +125,9 @@ into the campaign).
|
|
|
125
125
|
After 3-5 real campaigns complete the tail, review the threshold-trip
|
|
126
126
|
logs and adjust:
|
|
127
127
|
|
|
128
|
-
- `importLimit` higher only if users consistently ask for larger
|
|
129
|
-
|
|
130
|
-
- `sampleSize` higher if a 15-row
|
|
128
|
+
- `importLimit` higher only if users consistently ask for larger initial
|
|
129
|
+
setup slices and credit spend is acceptable.
|
|
130
|
+
- `sampleSize` higher if a 15-row internal slice is not enough to judge
|
|
131
131
|
quality for a specific market.
|
|
132
132
|
- `minProjectedPass` lower only if fewer than 3 passing examples is still
|
|
133
133
|
enough for a confident user decision.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "v2.1-compact",
|
|
3
3
|
"workflow": "create-campaign-v2",
|
|
4
|
-
"principle": "CampaignOffer state and watch link are canonical. Create the watched shell, approve source, materialize and confirm the source list, process the first
|
|
4
|
+
"principle": "CampaignOffer state and watch link are canonical. Create the watched shell, approve source, materialize and confirm the source list, internally process the first campaign-table execution slice, save rubrics for approval, approve the message template, then run the bounded filter/message cascade before Settings, sequence, and explicit start.",
|
|
5
5
|
"normalCustomerPath": "Use campaign state, MCP responses, and concise watchNarration. Do not create, read, link, or surface local draft files.",
|
|
6
6
|
"legacyCompatibility": {
|
|
7
7
|
"validationSubskill": "create-campaign-v2-validation",
|
|
@@ -494,7 +494,7 @@
|
|
|
494
494
|
"specific source action awaiting approval",
|
|
495
495
|
"for Signal Discovery: compact Source Recommendation with target, raw-engager math, selected-post table, review checkpoint, estimated fit, and fallback",
|
|
496
496
|
"for Signal Discovery: selected post count and target engager/source-candidate volume",
|
|
497
|
-
"
|
|
497
|
+
"internal campaign-table execution slice size, clearly separate from source sampling",
|
|
498
498
|
"runner-up and why it lost",
|
|
499
499
|
"raw volume",
|
|
500
500
|
"sampled people",
|
|
@@ -923,7 +923,7 @@
|
|
|
923
923
|
"run background post-find-leads-message-scout when available",
|
|
924
924
|
"get_subskill_prompt({ subskillName: \"generate-messages\", offset, limit }) until hasMore=false"
|
|
925
925
|
],
|
|
926
|
-
"stateSource": "campaignBrief, source, selectedLeadListId, workflowTableId,
|
|
926
|
+
"stateSource": "campaignBrief, source, selectedLeadListId, workflowTableId, execution-slice row ids/hash",
|
|
927
927
|
"outputState": "messageDraftRecommendation"
|
|
928
928
|
}
|
|
929
929
|
],
|
|
@@ -945,7 +945,7 @@
|
|
|
945
945
|
"Run post-find-leads-message-scout when available; otherwise parent fallback must load get_subskill_prompt({ subskillName: \"generate-messages\" }) from live state.",
|
|
946
946
|
"brief.md, lead-review.md, and lead-sample.json are optional debug context only.",
|
|
947
947
|
"messageDraftRecommendation returns templateRecommendation, tokenFillRules, renderedSample, concerns, status, basisToken, outputAt, outputHash, and error/retry detail.",
|
|
948
|
-
"If campaign/source/table/
|
|
948
|
+
"If campaign/source/table/execution-slice basis does not match, classify the output stale or blocked."
|
|
949
949
|
],
|
|
950
950
|
"doNotAllow": [
|
|
951
951
|
"create_campaign",
|
|
@@ -1052,7 +1052,7 @@
|
|
|
1052
1052
|
},
|
|
1053
1053
|
{
|
|
1054
1054
|
"id": "validate-sample",
|
|
1055
|
-
"label": "Validate
|
|
1055
|
+
"label": "Validate campaign-table execution slice",
|
|
1056
1056
|
"currentStepValue": "apply-icp-rubric",
|
|
1057
1057
|
"reference": "references/sample-validation-loop.md",
|
|
1058
1058
|
"visibleStepRule": "Filter Leads is reached only after saved-filter approval. On approve-message, save the template, refresh apply-icp-rubric narration, then queue bounded Enrich Prospect cells.",
|
|
@@ -1068,7 +1068,7 @@
|
|
|
1068
1068
|
},
|
|
1069
1069
|
{
|
|
1070
1070
|
"tool": "queue_cells",
|
|
1071
|
-
"purpose": "queue ICP/enrichment cells for the
|
|
1071
|
+
"purpose": "queue ICP/enrichment cells for the internal campaign-table execution slice only",
|
|
1072
1072
|
"requiredFields": [
|
|
1073
1073
|
"workflowTableId",
|
|
1074
1074
|
"reviewBatchRowIds",
|
|
@@ -1148,7 +1148,7 @@
|
|
|
1148
1148
|
},
|
|
1149
1149
|
{
|
|
1150
1150
|
"id": "auto-execute-messaging",
|
|
1151
|
-
"label": "Generate
|
|
1151
|
+
"label": "Generate initial campaign-row messages",
|
|
1152
1152
|
"currentStepValue": "auto-execute-messaging",
|
|
1153
1153
|
"references": [
|
|
1154
1154
|
"references/parallel-critique-protocol.md",
|
|
@@ -71,7 +71,7 @@ Revision choices route back to the exact upstream stage:
|
|
|
71
71
|
|
|
72
72
|
## 6) Post-Message Tail
|
|
73
73
|
|
|
74
|
-
After message approval, queue only the
|
|
74
|
+
After message approval, queue only the initial campaign-table execution-slice cells needed to move
|
|
75
75
|
the watched app through enrichment, ICP filtering, and approved-template message
|
|
76
76
|
generation. Keep the tail observable through watch narration.
|
|
77
77
|
|
|
@@ -49,8 +49,8 @@ gate; route back to message generation.
|
|
|
49
49
|
the user intentionally supplied a source. If present, the approval packet must
|
|
50
50
|
summarize the source type, input mode, supplied profile/domain/list count,
|
|
51
51
|
sampled count, what will be materialized after approval, and that only the
|
|
52
|
-
|
|
53
|
-
Use the phrase "only the
|
|
52
|
+
initial campaign rows will be enriched/messaged before greenlight.
|
|
53
|
+
Use the phrase "only the initial campaign rows" plainly enough that the operator
|
|
54
54
|
understands approval is not permission to process the full supplied source.
|
|
55
55
|
|
|
56
56
|
If any required artifact is missing, do NOT show the gate. Route back to the
|
|
@@ -21,7 +21,7 @@ Use only live campaign inputs supplied by the parent thread or scoped MCP tools:
|
|
|
21
21
|
- campaign brief content
|
|
22
22
|
- approved source decision and selected lead list/source state
|
|
23
23
|
- `workflowTableId`
|
|
24
|
-
-
|
|
24
|
+
- initial campaign-table execution slice rows, including row ids/hash when available
|
|
25
25
|
- user's filter choice and any explicit exclusions or tradeoffs
|
|
26
26
|
|
|
27
27
|
The filter may inspect campaign-table rows through scoped tools such as
|
|
@@ -112,7 +112,7 @@ prospect can afford this specific offer at this specific price point. Use a
|
|
|
112
112
|
reasonable public proxy such as funding, headcount, revenue band, team maturity,
|
|
113
113
|
current tool spend, practice size, location count, consumer purchasing power,
|
|
114
114
|
job-to-be-done intensity, or buyer budget ownership. If no reliable proxy exists
|
|
115
|
-
in the
|
|
115
|
+
in the initial campaign rows or normal enrichment path, return `confirm-with-user` and
|
|
116
116
|
ask the parent to get the budget proxy before message approval.
|
|
117
117
|
|
|
118
118
|
## Table-Stakes Gates
|
|
@@ -141,7 +141,7 @@ the gate is irrelevant for this campaign:
|
|
|
141
141
|
## Competitor / Vendor Exclusion
|
|
142
142
|
|
|
143
143
|
Every confirmed filter should include a competitor / vendor / wrong-side
|
|
144
|
-
exclusion unless the brief and
|
|
144
|
+
exclusion unless the brief and campaign rows make it clearly irrelevant.
|
|
145
145
|
|
|
146
146
|
Use this test:
|
|
147
147
|
|
|
@@ -149,11 +149,11 @@ Use this test:
|
|
|
149
149
|
or marketplace participant appear on the same comparison page as the client?
|
|
150
150
|
- Would they compete for the same customer budget, sell into the same buyer
|
|
151
151
|
workflow, or sit on the wrong side of the marketplace?
|
|
152
|
-
- Did the
|
|
152
|
+
- Did the campaign rows show adjacent companies that the customer would likely
|
|
153
153
|
reject only after seeing the list?
|
|
154
154
|
|
|
155
155
|
If yes, add an explicit exclude rule. Include named competitors from the brief,
|
|
156
|
-
|
|
156
|
+
campaign rows, or user context when available, plus the general category
|
|
157
157
|
exclusion so new lookalike competitors are also blocked.
|
|
158
158
|
|
|
159
159
|
## Marketplace Safety
|
|
@@ -170,14 +170,14 @@ Examples:
|
|
|
170
170
|
- Supply-side acquisition campaign: exclude demand-side buyers or employers when
|
|
171
171
|
they are not the outbound target.
|
|
172
172
|
|
|
173
|
-
If more than roughly 20% of the
|
|
173
|
+
If more than roughly 20% of the initial campaign rows appear to be the forbidden side,
|
|
174
174
|
classify it as a list/source problem and return `revise-find-leads`; do not
|
|
175
175
|
hide that problem behind narrow rubrics.
|
|
176
176
|
|
|
177
177
|
## Suppression And Relationship Safety
|
|
178
178
|
|
|
179
179
|
Do not put DNC or one-off relationship-safety notes into production rubrics
|
|
180
|
-
unless the
|
|
180
|
+
unless the campaign rows show that the pattern will leak at meaningful volume
|
|
181
181
|
and normal DNC/domain suppression will not catch it. Former employers, existing
|
|
182
182
|
customers, investors, partner lists, and one-off do-not-contact domains usually
|
|
183
183
|
belong in the recommendation as DNC/suppression instructions outside the rubric JSON.
|
|
@@ -231,19 +231,19 @@ Recommended grouping:
|
|
|
231
231
|
|
|
232
232
|
For each proposed rule:
|
|
233
233
|
|
|
234
|
-
1. Inspect matching and failing
|
|
234
|
+
1. Inspect matching and failing campaign rows.
|
|
235
235
|
2. Decide whether the rule removes real noise or blocks real buyers.
|
|
236
236
|
3. Mark the rule as necessary, loosen, or remove.
|
|
237
237
|
4. Estimate the resulting pass rate and yield impact.
|
|
238
238
|
|
|
239
239
|
Repeated false positives should become explicit exclude rules whenever the same
|
|
240
|
-
pattern appears more than once in the
|
|
240
|
+
pattern appears more than once in the campaign rows. Preview-card missingness is
|
|
241
241
|
not a hard production exclusion unless the same missing evidence will remain
|
|
242
242
|
missing after normal enrichment/public research.
|
|
243
243
|
|
|
244
244
|
## Source Contradictions
|
|
245
245
|
|
|
246
|
-
If
|
|
246
|
+
If campaign-row evidence contradicts the approved source thesis, do not rewrite
|
|
247
247
|
the campaign brief silently. Return one of these instead:
|
|
248
248
|
|
|
249
249
|
- `confirm-with-user` when a viable alternative source or filter tradeoff needs
|
|
@@ -319,7 +319,7 @@ authority, account fit, capacity, geography, and exclusions.
|
|
|
319
319
|
- Do not save rubrics for `confirm-with-user` or `revise-find-leads`.
|
|
320
320
|
- Do not loosen the filter just to preserve volume.
|
|
321
321
|
- Do not make the filter so narrow that it contradicts the approved source
|
|
322
|
-
unless
|
|
322
|
+
unless campaign-row evidence clearly requires it.
|
|
323
323
|
|
|
324
324
|
## Prohibited During Normal Create-Campaign
|
|
325
325
|
|
|
@@ -18,7 +18,7 @@ CampaignOffer state and the watch link are canonical. Disk artifacts are
|
|
|
18
18
|
optional debug/UAT diagnostics, and normal customer runs should not expose local
|
|
19
19
|
draft files. Resume, gating, and handoff read campaign state first. At this
|
|
20
20
|
point, `workflowTableId` is the campaign table, while `selectedLeadListId`
|
|
21
|
-
remains the source list that produced the
|
|
21
|
+
remains the source list that produced the campaign rows.
|
|
22
22
|
|
|
23
23
|
## Step 16 Setup
|
|
24
24
|
|
|
@@ -64,7 +64,7 @@ currentStep: "sequence" })` to attach the sender via the v3 senders route and
|
|
|
64
64
|
The final handoff must answer five customer questions in plain language:
|
|
65
65
|
|
|
66
66
|
- where to inspect the campaign (`watchUrl`)
|
|
67
|
-
- what is ready now (brief, filters/rubrics,
|
|
67
|
+
- what is ready now (brief, filters/rubrics, campaign rows, messages, and
|
|
68
68
|
sequence after a sender is attached)
|
|
69
69
|
- whether the next UI step is Settings, Sequence, or Send
|
|
70
70
|
- why the selected LinkedIn sender and Slack reply review matter before launch
|
|
@@ -77,8 +77,8 @@ When `lead-source-intake.json` exists, also answer:
|
|
|
77
77
|
- which source was materialized (`supplied-linkedin-profiles`,
|
|
78
78
|
`supplied-domains`, or `existing-lead-list`)
|
|
79
79
|
- how many rows/accounts were supplied
|
|
80
|
-
- how many rows were imported into the
|
|
81
|
-
- that only the
|
|
80
|
+
- how many rows were imported into the initial campaign setup slice
|
|
81
|
+
- that only the initial campaign rows were enriched and messaged before
|
|
82
82
|
greenlight, not the full supplied list
|
|
83
83
|
- for `existing-lead-list`, that the source list was reused, not recreated
|
|
84
84
|
|