@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
|
@@ -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
|
|
@@ -458,6 +463,32 @@ required field is missing, the supplied inputs conflict, or the campaign focus i
|
|
|
458
463
|
genuinely ambiguous. It is fine to include an explicit assumption line in the
|
|
459
464
|
brief; the approval gate lets the user revise it.
|
|
460
465
|
|
|
466
|
+
### YOLO Mode
|
|
467
|
+
|
|
468
|
+
If the invocation or any later user message explicitly asks for "yolo mode",
|
|
469
|
+
"YOLO", `--yolo`, `mode=yolo`, "autopilot", "use best guesses", "answer for
|
|
470
|
+
me", "use best estimates", or "just run it", enable YOLO mode for the rest of
|
|
471
|
+
the run. Treat YOLO as `interactionMode: "autonomous"` plus an intake policy:
|
|
472
|
+
|
|
473
|
+
- If campaign identity is missing, ask only for the LinkedIn profile or company
|
|
474
|
+
website in normal chat; do not ask buyer, offer, proof, source, or filter setup
|
|
475
|
+
questions before that.
|
|
476
|
+
- Treat any freeform directions already provided, or added later by the user, as
|
|
477
|
+
operator directions for the rest of the run. If directions conflict, the newest
|
|
478
|
+
user direction wins.
|
|
479
|
+
- After the lightweight identity/company lookup, infer the buyer segment,
|
|
480
|
+
offer/CTA, proof to use or avoid, first lead source, filter choice, and message
|
|
481
|
+
direction with best estimates from public/company context plus operator
|
|
482
|
+
directions. State the important assumptions in the brief and watch narration.
|
|
483
|
+
- Do not use structured setup questions in YOLO mode. For pre-launch approval
|
|
484
|
+
gates, choose the recommended path yourself when confidence is sufficient, show
|
|
485
|
+
the assumed choice briefly, and continue.
|
|
486
|
+
- Pause only when no reasonable estimate exists, a tool requires missing
|
|
487
|
+
credentials/data, the source/message quality floor fails, or the next action
|
|
488
|
+
would start the live campaign.
|
|
489
|
+
- Never call `start_campaign` from YOLO mode without explicit user launch
|
|
490
|
+
confirmation. Do not invent proof; mark proof gaps and use safer claims.
|
|
491
|
+
|
|
461
492
|
Before the identity gate, use this customer-facing shape:
|
|
462
493
|
|
|
463
494
|
```text
|
|
@@ -651,13 +682,13 @@ updates.
|
|
|
651
682
|
until `hasMore=false`. Message review requires Message Draft Builder output:
|
|
652
683
|
do not draft from a checklist, local markdown artifact, or parent-thread
|
|
653
684
|
intuition. Use campaign state, campaign brief content, selected source state, and
|
|
654
|
-
|
|
685
|
+
initial campaign-table execution slice rows as the source of truth; do not read stale local
|
|
655
686
|
markdown such as `message-validation.md`, inspect the database directly, or
|
|
656
687
|
synthesize local validation artifacts from general knowledge.
|
|
657
688
|
5. Create the campaign shell early with the v1 brief so the user can open the
|
|
658
689
|
watch link and see useful setup state immediately. Materialize the approved
|
|
659
|
-
source list, copy confirmed rows into the campaign, and process
|
|
660
|
-
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
|
|
661
692
|
queue workflow cells, attach a sequence, or start until saved filters and the
|
|
662
693
|
message template/token rules are approved. When filters are chosen, immediately
|
|
663
694
|
call `mcp__sellable__update_campaign({ campaignId, enableICPFilters: true, currentStep: "create-icp-rubric", watchNarration })`
|
|
@@ -665,7 +696,7 @@ updates.
|
|
|
665
696
|
After rubrics save, keep Filter Rules visible for approval; after approval,
|
|
666
697
|
move to Filter Leads and wait there for the background message recommendation.
|
|
667
698
|
If filters are skipped, move to Messages/message review. Queue the bounded
|
|
668
|
-
|
|
699
|
+
campaign-table execution-slice `enrichCellId` cells only after message approval. Move to
|
|
669
700
|
Messages only after at least one review row passes and one generated message
|
|
670
701
|
is ready.
|
|
671
702
|
Do not ask the user to approve the brief before shell creation unless they
|
|
@@ -674,14 +705,14 @@ updates.
|
|
|
674
705
|
`mcp__sellable__update_campaign({ campaignId, currentStep })` before major
|
|
675
706
|
visible work so the user can watch progress in the app: `create-offer` for
|
|
676
707
|
the brief, `pick-provider` or the selected provider step while sourcing,
|
|
677
|
-
`filter-choice` after the
|
|
708
|
+
`filter-choice` after source rows are copied into the campaign table, `create-icp-rubric` as soon
|
|
678
709
|
as filters are chosen and while saved filters await approval,
|
|
679
710
|
`apply-icp-rubric` after filter approval and message approval while bounded
|
|
680
711
|
enrichment/filter scoring runs, `validate-sample` only as a recovery/legacy
|
|
681
712
|
observation state,
|
|
682
|
-
`auto-execute-messaging` after at least one row passes and
|
|
713
|
+
`auto-execute-messaging` after at least one row passes and initial campaign-row
|
|
683
714
|
messages are being generated or reviewed, `awaiting-user-greenlight` only
|
|
684
|
-
after generated
|
|
715
|
+
after generated campaign-row messages are approved, `settings` for sender
|
|
685
716
|
selection, `sequence` after sender attach, and `send` once the recommended
|
|
686
717
|
sequence is attached. Do not advance the step backward.
|
|
687
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,13 +76,25 @@ 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,
|
|
81
83
|
use the available Sellable profile/company/post tools and carry explicit proof
|
|
82
84
|
gaps into the brief.
|
|
83
85
|
|
|
86
|
+
## YOLO Mode
|
|
87
|
+
|
|
88
|
+
Enable YOLO mode when the user asks for yolo/autopilot, passes `--yolo` or
|
|
89
|
+
`mode=yolo`, or says to use best guesses/estimates and answer for them. Ask only
|
|
90
|
+
for the LinkedIn profile or company website if identity is missing. After the
|
|
91
|
+
identity lookup, infer buyer, offer/CTA, proof, source, filters, and message
|
|
92
|
+
direction from company evidence plus user directions; newest directions win.
|
|
93
|
+
Set `interactionMode: "autonomous"` once `campaignId` exists. Auto-select
|
|
94
|
+
pre-launch choices when confidence is sufficient, but show the assumed choice
|
|
95
|
+
briefly. Pause for missing credentials/data, failed quality floors, or final
|
|
96
|
+
launch. Never call `start_campaign` without explicit launch confirmation.
|
|
97
|
+
|
|
84
98
|
## Structured Questions
|
|
85
99
|
|
|
86
100
|
Use the host-native structured question gate (`request_user_input` or
|
|
@@ -166,33 +180,27 @@ reasonable refinement, move to Prospeo. Prospeo is the terminal fallback; if it
|
|
|
166
180
|
also falls below 10%, tighten the ICP/source direction instead of inventing
|
|
167
181
|
another provider.
|
|
168
182
|
|
|
169
|
-
After scouting, show a second approval gate for the concrete source action.
|
|
170
|
-
Signal Discovery,
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
the source
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
approval to materialize the source list with
|
|
185
|
-
`targetLeadCount` around 1,000 source contacts by default (use the provider cap
|
|
186
|
-
internally when the raw pool is larger). After that source list is ready,
|
|
187
|
-
`confirm_lead_list({ reviewBatchLimit: 15 })` copies confirmed source rows into
|
|
188
|
-
the campaign table and returns the first 15 review/process row ids for fit and
|
|
189
|
-
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.
|
|
190
198
|
|
|
191
199
|
After the user approves this concrete source-action gate, do not show the
|
|
192
200
|
Source Recommendation again and do not ask another source approval question.
|
|
193
201
|
Acknowledge once, then call `import_leads` immediately with the approved source
|
|
194
202
|
math. For Sales Nav/Prospeo, pass `targetLeadCount` as the approved source-list
|
|
195
|
-
export count, not the
|
|
203
|
+
export count, not the campaign execution-slice size. For Signal Discovery, pass
|
|
196
204
|
`provider: "signal-discovery"`, `targetEngagerCount`, `maxPostsToScrape`, and
|
|
197
205
|
`confirmed: true`; the tool owns moving the watch UI to source-list progress
|
|
198
206
|
after a lead-list/job id exists.
|
|
@@ -209,32 +217,24 @@ Use Signal Discovery first.
|
|
|
209
217
|
**Working assumption:** ~20% of raw post engagers become good-fit prospects<br>
|
|
210
218
|
**Engagers needed:** ~1,500 raw engagers<br>
|
|
211
219
|
**Planning floor:** continue only when sampled/projected fit is at least 10% after cleanup; below that, switch to Sales Nav recent activity<br>
|
|
212
|
-
**
|
|
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>
|
|
213
221
|
|
|
214
222
|
### Selected posts
|
|
215
223
|
|
|
216
|
-
|
|
217
|
-
| ---------------- | ----------------------------------------------- | -----------------: |
|
|
218
|
-
| Dylan Power | Claude outbound system | ~1,571 |
|
|
219
|
-
| Fivos Aresti | Replacing Clay outbound with Claude Code | ~734 |
|
|
220
|
-
| Divyanshi Sharma | LinkedIn lead-gen system built with Claude Code | ~508 |
|
|
224
|
+
Show author/topic, why it fits, and visible engagement.
|
|
221
225
|
|
|
222
|
-
**Total visible pool:** ~2,
|
|
223
|
-
**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
|
|
224
228
|
|
|
225
229
|
### Recommendation
|
|
226
230
|
|
|
227
231
|
Approve scraping these 3 posts.
|
|
228
232
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
**First pass:** build the source list, copy all confirmed source rows into the
|
|
234
|
-
campaign, then process only the first 15 rows so we can inspect quality before
|
|
235
|
-
scaling.
|
|
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.
|
|
236
236
|
|
|
237
|
-
**Fallback:** if sampled/projected fit falls below 10%, or if the
|
|
237
|
+
**Fallback:** if sampled/projected fit falls below 10%, or if the source sample
|
|
238
238
|
is too vendor-heavy, agency-heavy, or off-ICP, switch to Sales Nav recent
|
|
239
239
|
activity.
|
|
240
240
|
```
|
|
@@ -246,7 +246,8 @@ authorizes. For Sales Nav/Prospeo it must also show source export math:
|
|
|
246
246
|
`rawResultCount`, `sampledFitRate`, conservative projected fit rate,
|
|
247
247
|
`targetLeadCount` for the source list, and projected good-fit count from that
|
|
248
248
|
export. If projected good-fit count is below target, the recommendation is to
|
|
249
|
-
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.
|
|
250
251
|
|
|
251
252
|
Supplied profile CSVs, company/domain CSVs, pasted domains, and existing
|
|
252
253
|
Sellable lead lists are supported, but keep provider mechanics out of the first
|
|
@@ -259,7 +260,7 @@ After `confirm_lead_list` copies a non-empty confirmed source into the campaign
|
|
|
259
260
|
filter-choice question immediately. Do not call
|
|
260
261
|
`get_post_find_leads_scout_registry`, load filter/message subskill prompts, or
|
|
261
262
|
spawn post-lead workers before that question. The only customer-facing work
|
|
262
|
-
before the question should be a short
|
|
263
|
+
before the question should be a short campaign setup summary and the choice:
|
|
263
264
|
add filters, skip filters, or revise source.
|
|
264
265
|
|
|
265
266
|
If the user chooses filters, then load the post-lead registry/reference needed
|
|
@@ -293,7 +294,7 @@ get_subskill_prompt({ subskillName: "generate-messages", offset, limit }) until
|
|
|
293
294
|
No shortcut message instructions are valid. If the host cannot launch the
|
|
294
295
|
agent, the parent fallback must run the same full prompt from live campaign
|
|
295
296
|
state before drafting. Do not render message review until
|
|
296
|
-
`messageDraftRecommendation` proves current campaign/table/
|
|
297
|
+
`messageDraftRecommendation` proves current campaign/table/execution-slice
|
|
297
298
|
`generate-messages` basis.
|
|
298
299
|
|
|
299
300
|
## Hard Gates
|
|
@@ -302,7 +303,7 @@ state before drafting. Do not render message review until
|
|
|
302
303
|
- Do not call `import_leads` or `confirm_lead_list` until the lead source is
|
|
303
304
|
approved.
|
|
304
305
|
- Do not queue enrichment, ICP scoring, filtering, or product Generate Message
|
|
305
|
-
cells until the
|
|
306
|
+
cells until the campaign-table execution slice exists and the required message/filter approvals
|
|
306
307
|
are complete.
|
|
307
308
|
- Do not call `check_rubric`; persist production rubrics with `save_rubrics`.
|
|
308
309
|
- Do not call `start_campaign` until the user explicitly confirms launch after
|
|
@@ -318,6 +319,6 @@ Load references only when needed:
|
|
|
318
319
|
- `references/lead-validation-preview.md` for legacy/debug preview shapes.
|
|
319
320
|
- `references/filter-leads.md` for rubric design and `save_rubrics` rules.
|
|
320
321
|
- `references/step-13-import-leads.md` before source copy.
|
|
321
|
-
- `references/sample-validation-loop.md` before
|
|
322
|
+
- `references/sample-validation-loop.md` before campaign setup validation.
|
|
322
323
|
- `references/final-handoff-contract.md` for Settings, sender, sequence, and
|
|
323
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.
|