@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
|
@@ -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",
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"campaignBrief",
|
|
23
23
|
"currentStep",
|
|
24
24
|
"watchNarration",
|
|
25
|
+
"interactionMode",
|
|
25
26
|
"providerSearchAssociation",
|
|
26
27
|
"selectedLeadListId",
|
|
27
28
|
"workflowTableId",
|
|
@@ -78,6 +79,40 @@
|
|
|
78
79
|
"Do not call start_campaign until the user explicitly confirms launch.",
|
|
79
80
|
"Do not use local files as durable state in normal customer runs."
|
|
80
81
|
],
|
|
82
|
+
"yoloMode": {
|
|
83
|
+
"triggerPhrases": [
|
|
84
|
+
"yolo",
|
|
85
|
+
"--yolo",
|
|
86
|
+
"mode=yolo",
|
|
87
|
+
"autopilot",
|
|
88
|
+
"use best guesses",
|
|
89
|
+
"use best estimates",
|
|
90
|
+
"answer for me",
|
|
91
|
+
"just run it"
|
|
92
|
+
],
|
|
93
|
+
"identityRequestOnlyWhenMissing": true,
|
|
94
|
+
"operatorDirectionsRule": "Treat freeform directions supplied at invocation or later as durable operator directions; newest conflicting direction wins.",
|
|
95
|
+
"setInteractionModeAfterCampaignCreate": "autonomous",
|
|
96
|
+
"autoSelectsPreLaunchChoices": [
|
|
97
|
+
"campaign focus",
|
|
98
|
+
"brief approval",
|
|
99
|
+
"source scouting plan",
|
|
100
|
+
"source review/import approval",
|
|
101
|
+
"filters vs skip filters",
|
|
102
|
+
"filter rubric approval",
|
|
103
|
+
"message template approval when recommendation is approve-message",
|
|
104
|
+
"generated message review when quality floor passes",
|
|
105
|
+
"sender selection when exactly one connected sender is safe"
|
|
106
|
+
],
|
|
107
|
+
"mustPauseFor": [
|
|
108
|
+
"missing campaign identity",
|
|
109
|
+
"missing credentials or required data",
|
|
110
|
+
"ambiguous choice with no reasonable estimate",
|
|
111
|
+
"source/message/filter quality floor failure",
|
|
112
|
+
"final live launch confirmation"
|
|
113
|
+
],
|
|
114
|
+
"neverAutoStart": true
|
|
115
|
+
},
|
|
81
116
|
"steps": [
|
|
82
117
|
{
|
|
83
118
|
"id": "bootstrap",
|
|
@@ -156,7 +191,23 @@
|
|
|
156
191
|
"uses": "request_user_input",
|
|
157
192
|
"singleChoice": true,
|
|
158
193
|
"requiredOption": "Other / custom",
|
|
159
|
-
"neverCollectOpenTextWithStructuredQuestion": true
|
|
194
|
+
"neverCollectOpenTextWithStructuredQuestion": true,
|
|
195
|
+
"skipIf": "yolo_mode with any reasonable best-estimate focus"
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"action": "infer_strategy_packet_in_yolo_mode",
|
|
199
|
+
"when": "yolo_mode",
|
|
200
|
+
"skipStructuredSetupQuestions": true,
|
|
201
|
+
"inferFields": [
|
|
202
|
+
"buyer segment",
|
|
203
|
+
"offer/CTA",
|
|
204
|
+
"proof to use or avoid",
|
|
205
|
+
"lead source",
|
|
206
|
+
"filter choice",
|
|
207
|
+
"message direction"
|
|
208
|
+
],
|
|
209
|
+
"sourceOfTruth": "identity/company lookup plus operator directions",
|
|
210
|
+
"mustStateAssumptionsInBrief": true
|
|
160
211
|
},
|
|
161
212
|
{
|
|
162
213
|
"action": "create_watchable_campaign_shell_with_v1_brief",
|
|
@@ -231,7 +282,8 @@
|
|
|
231
282
|
{
|
|
232
283
|
"action": "ask_brief_choice",
|
|
233
284
|
"uses": "request_user_input",
|
|
234
|
-
"choices": ["Approve brief", "Revise brief", "Pause here"]
|
|
285
|
+
"choices": ["Approve brief", "Revise brief", "Pause here"],
|
|
286
|
+
"skipIf": "yolo_mode; auto_continue after rendering assumptions unless brief quality floor fails"
|
|
235
287
|
}
|
|
236
288
|
],
|
|
237
289
|
"requiredCampaignState": [
|
|
@@ -283,7 +335,12 @@
|
|
|
283
335
|
"fallback lane if the first lane is weak",
|
|
284
336
|
"what approval authorizes"
|
|
285
337
|
],
|
|
286
|
-
"approvalAuthorizes": "source scouting/search only; no import/send"
|
|
338
|
+
"approvalAuthorizes": "source scouting/search only; no import/send",
|
|
339
|
+
"yoloMode": {
|
|
340
|
+
"autoApproveRecommendedLane": true,
|
|
341
|
+
"mustShowAssumedChoice": true,
|
|
342
|
+
"pauseIfConfidenceLow": true
|
|
343
|
+
}
|
|
287
344
|
},
|
|
288
345
|
"defaultWhenSourceUnspecified": [
|
|
289
346
|
"signal-discovery",
|
|
@@ -325,7 +382,7 @@
|
|
|
325
382
|
"action": "show_pre_scout_source_recommendation",
|
|
326
383
|
"uses": "request_user_input",
|
|
327
384
|
"oneShot": true,
|
|
328
|
-
"skipIf": "approved or leadSourceProvider",
|
|
385
|
+
"skipIf": "approved or leadSourceProvider or yolo_mode auto-selected source_lane_approved",
|
|
329
386
|
"requiredBeforeTools": [
|
|
330
387
|
"get_provider_prompt",
|
|
331
388
|
"search_signals",
|
|
@@ -437,7 +494,7 @@
|
|
|
437
494
|
"specific source action awaiting approval",
|
|
438
495
|
"for Signal Discovery: compact Source Recommendation with target, raw-engager math, selected-post table, review checkpoint, estimated fit, and fallback",
|
|
439
496
|
"for Signal Discovery: selected post count and target engager/source-candidate volume",
|
|
440
|
-
"
|
|
497
|
+
"internal campaign-table execution slice size, clearly separate from source sampling",
|
|
441
498
|
"runner-up and why it lost",
|
|
442
499
|
"raw volume",
|
|
443
500
|
"sampled people",
|
|
@@ -470,7 +527,8 @@
|
|
|
470
527
|
],
|
|
471
528
|
"requiredNextActionAfterApproval": "ack once; call import_leads immediately",
|
|
472
529
|
"signalDiscoveryNextTool": "import_leads({ provider: \"signal-discovery\", targetEngagerCount, maxPostsToScrape, confirmed: true })"
|
|
473
|
-
}
|
|
530
|
+
},
|
|
531
|
+
"autoSelectIf": "yolo_mode and projected usable pool clears the source quality floor"
|
|
474
532
|
}
|
|
475
533
|
],
|
|
476
534
|
"requiredCampaignState": [
|
|
@@ -615,7 +673,8 @@
|
|
|
615
673
|
{
|
|
616
674
|
"action": "ask_filter_choice",
|
|
617
675
|
"uses": "request_user_input",
|
|
618
|
-
"choices": ["Use filters", "Skip filters", "Revise source"]
|
|
676
|
+
"choices": ["Use filters", "Skip filters", "Revise source"],
|
|
677
|
+
"autoSelectIf": "yolo_mode; choose filters unless source is tightly curated or user directed otherwise"
|
|
619
678
|
}
|
|
620
679
|
],
|
|
621
680
|
"hardRules": [
|
|
@@ -729,7 +788,8 @@
|
|
|
729
788
|
"action": "ask_filter_rubric_review_choice",
|
|
730
789
|
"uses": "request_user_input",
|
|
731
790
|
"choices": ["Approve filters", "Revise filters", "Pause"],
|
|
732
|
-
"purpose": "let the user read saved rubrics before Filter Leads or enrichment"
|
|
791
|
+
"purpose": "let the user read saved rubrics before Filter Leads or enrichment",
|
|
792
|
+
"autoSelectIf": "yolo_mode and rubrics are production-shaped"
|
|
733
793
|
}
|
|
734
794
|
],
|
|
735
795
|
"requiredCampaignState": [
|
|
@@ -809,7 +869,8 @@
|
|
|
809
869
|
{
|
|
810
870
|
"action": "ask_filter_rubric_review_choice",
|
|
811
871
|
"uses": "request_user_input",
|
|
812
|
-
"choices": ["Approve filters", "Revise filters", "Pause"]
|
|
872
|
+
"choices": ["Approve filters", "Revise filters", "Pause"],
|
|
873
|
+
"autoSelectIf": "yolo_mode and rubrics are production-shaped"
|
|
813
874
|
}
|
|
814
875
|
],
|
|
815
876
|
"requiredCampaignState": ["campaignId", "workflowTableId"],
|
|
@@ -862,7 +923,7 @@
|
|
|
862
923
|
"run background post-find-leads-message-scout when available",
|
|
863
924
|
"get_subskill_prompt({ subskillName: \"generate-messages\", offset, limit }) until hasMore=false"
|
|
864
925
|
],
|
|
865
|
-
"stateSource": "campaignBrief, source, selectedLeadListId, workflowTableId,
|
|
926
|
+
"stateSource": "campaignBrief, source, selectedLeadListId, workflowTableId, execution-slice row ids/hash",
|
|
866
927
|
"outputState": "messageDraftRecommendation"
|
|
867
928
|
}
|
|
868
929
|
],
|
|
@@ -884,7 +945,7 @@
|
|
|
884
945
|
"Run post-find-leads-message-scout when available; otherwise parent fallback must load get_subskill_prompt({ subskillName: \"generate-messages\" }) from live state.",
|
|
885
946
|
"brief.md, lead-review.md, and lead-sample.json are optional debug context only.",
|
|
886
947
|
"messageDraftRecommendation returns templateRecommendation, tokenFillRules, renderedSample, concerns, status, basisToken, outputAt, outputHash, and error/retry detail.",
|
|
887
|
-
"If campaign/source/table/
|
|
948
|
+
"If campaign/source/table/execution-slice basis does not match, classify the output stale or blocked."
|
|
888
949
|
],
|
|
889
950
|
"doNotAllow": [
|
|
890
951
|
"create_campaign",
|
|
@@ -947,7 +1008,8 @@
|
|
|
947
1008
|
{
|
|
948
1009
|
"action": "ask_message_review_choice",
|
|
949
1010
|
"uses": "request_user_input",
|
|
950
|
-
"choices": ["approve-message", "revise-messaging"]
|
|
1011
|
+
"choices": ["approve-message", "revise-messaging"],
|
|
1012
|
+
"autoSelectIf": "yolo_mode and Recommendation is approve-message; revise autonomously when Recommendation is revise-messaging"
|
|
951
1013
|
},
|
|
952
1014
|
{
|
|
953
1015
|
"action": "sync_approved_message_set_to_campaign_brief",
|
|
@@ -990,7 +1052,7 @@
|
|
|
990
1052
|
},
|
|
991
1053
|
{
|
|
992
1054
|
"id": "validate-sample",
|
|
993
|
-
"label": "Validate
|
|
1055
|
+
"label": "Validate campaign-table execution slice",
|
|
994
1056
|
"currentStepValue": "apply-icp-rubric",
|
|
995
1057
|
"reference": "references/sample-validation-loop.md",
|
|
996
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.",
|
|
@@ -1006,7 +1068,7 @@
|
|
|
1006
1068
|
},
|
|
1007
1069
|
{
|
|
1008
1070
|
"tool": "queue_cells",
|
|
1009
|
-
"purpose": "queue ICP/enrichment cells for the
|
|
1071
|
+
"purpose": "queue ICP/enrichment cells for the internal campaign-table execution slice only",
|
|
1010
1072
|
"requiredFields": [
|
|
1011
1073
|
"workflowTableId",
|
|
1012
1074
|
"reviewBatchRowIds",
|
|
@@ -1086,7 +1148,7 @@
|
|
|
1086
1148
|
},
|
|
1087
1149
|
{
|
|
1088
1150
|
"id": "auto-execute-messaging",
|
|
1089
|
-
"label": "Generate
|
|
1151
|
+
"label": "Generate initial campaign-row messages",
|
|
1090
1152
|
"currentStepValue": "auto-execute-messaging",
|
|
1091
1153
|
"references": [
|
|
1092
1154
|
"references/parallel-critique-protocol.md",
|
|
@@ -1163,7 +1225,8 @@
|
|
|
1163
1225
|
"Revise filters",
|
|
1164
1226
|
"Revise message template",
|
|
1165
1227
|
"Pause here"
|
|
1166
|
-
]
|
|
1228
|
+
],
|
|
1229
|
+
"autoSelectIf": "yolo_mode and the first passing generated message clears the quality floor"
|
|
1167
1230
|
}
|
|
1168
1231
|
],
|
|
1169
1232
|
"allowedTools": [
|
|
@@ -1238,7 +1301,8 @@
|
|
|
1238
1301
|
"Use this connected sender",
|
|
1239
1302
|
"Connect a different sender in Settings",
|
|
1240
1303
|
"Pause here"
|
|
1241
|
-
]
|
|
1304
|
+
],
|
|
1305
|
+
"autoSelectIf": "yolo_mode and exactly one safe connected sender is available"
|
|
1242
1306
|
},
|
|
1243
1307
|
{
|
|
1244
1308
|
"action": "attach_selected_sender",
|
|
@@ -1266,7 +1330,8 @@
|
|
|
1266
1330
|
"uses": "request_user_input",
|
|
1267
1331
|
"singleChoice": true,
|
|
1268
1332
|
"choices": ["Start campaign", "Review campaign first", "Pause here"],
|
|
1269
|
-
"onUserStart": "claude-greenlight"
|
|
1333
|
+
"onUserStart": "claude-greenlight",
|
|
1334
|
+
"neverAutoSelectInYolo": true
|
|
1270
1335
|
}
|
|
1271
1336
|
],
|
|
1272
1337
|
"allowedTools": [
|
|
@@ -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
|
|
|
@@ -7,13 +7,13 @@ on every revision round.
|
|
|
7
7
|
## Principle
|
|
8
8
|
|
|
9
9
|
We spend a bounded review/process sample (default 15 rows) to prove fit before
|
|
10
|
-
the user spends credits on the rest of the confirmed source list. The
|
|
10
|
+
the user spends credits on the rest of the confirmed source list. The setup loop has one job:
|
|
11
11
|
answer the question "do we have enough real passing examples for the user to
|
|
12
12
|
judge this campaign?" Message generation starts earlier: the first row that
|
|
13
13
|
passes filters is enough to begin observing or queueing Generate Message for
|
|
14
14
|
that passing row.
|
|
15
15
|
|
|
16
|
-
If the answer is yes, proceed to Step 15 messaging for the
|
|
16
|
+
If the answer is yes, proceed to Step 15 messaging for the initial campaign rows. If
|
|
17
17
|
the answer is no, diagnose whether the brief is wrong or the list is wrong,
|
|
18
18
|
and either revise brief autonomously OR escalate to the user — never
|
|
19
19
|
auto-revise leads.
|
|
@@ -25,7 +25,7 @@ auto-revise leads.
|
|
|
25
25
|
not a visible route)
|
|
26
26
|
- Approved message template/token rules exist in the campaign brief before any
|
|
27
27
|
enrichment or scoring cells are queued
|
|
28
|
-
- Confirmed campaign rows from Step 13, with
|
|
28
|
+
- Confirmed campaign rows from Step 13, with the internal execution slice from
|
|
29
29
|
`reviewBatchRowIds` (size: `importLimit`, default 15)
|
|
30
30
|
- Config from `auto-execute.yaml`: `sample.sampleSize`,
|
|
31
31
|
`sample.minProjectedPass`, `sample.maxRevisionRounds`
|
|
@@ -57,9 +57,9 @@ auto-revise leads.
|
|
|
57
57
|
scoring from the queued Enrich Prospect cells
|
|
58
58
|
|
|
59
59
|
6. wait_for_rubric_results(sample, targetCount = <cohortSize>, minPassedCount = 1)
|
|
60
|
-
- cohortSize = stats.totalRows of the enrichment batch, or the
|
|
60
|
+
- cohortSize = stats.totalRows of the enrichment batch, or the execution slice
|
|
61
61
|
count
|
|
62
|
-
- default targetCount=15 matches the default
|
|
62
|
+
- default targetCount=15 matches the default execution slice, but pass the
|
|
63
63
|
explicit batch count anyway so future larger expansion batches do not
|
|
64
64
|
accidentally stop early
|
|
65
65
|
(see §Known Tool Behaviors #3)
|
|
@@ -179,7 +179,7 @@ company, enrichCellId, enrichStatus) over the default shape.
|
|
|
179
179
|
|
|
180
180
|
### 5. `wait_for_rubric_results` can timeout with enough signal to decide
|
|
181
181
|
|
|
182
|
-
Observed: a 15-row
|
|
182
|
+
Observed: a 15-row internal execution slice may return `ready=false`, `reason="timeout"`,
|
|
183
183
|
and partial stats such as 12/15 scored, 4 passing, 4 messages generated. That is
|
|
184
184
|
enough to diagnose an underperforming sample. Waiting again without active
|
|
185
185
|
processing makes the experience feel frozen.
|
|
@@ -211,8 +211,8 @@ Worked examples with defaults (sampleSize=15, importLimit=15):
|
|
|
211
211
|
| 15 | 15 | Yes |
|
|
212
212
|
|
|
213
213
|
When non-default importLimit/sampleSize are configured, the math scales
|
|
214
|
-
the same way. In the default
|
|
215
|
-
import limit, so the projection is the actual
|
|
214
|
+
the same way. In the default internal-slice mode, the slice size equals the
|
|
215
|
+
import limit, so the projection is the actual pass count.
|
|
216
216
|
|
|
217
217
|
## Brief-vs-List Diagnosis
|
|
218
218
|
|
|
@@ -55,7 +55,7 @@ Supported branches:
|
|
|
55
55
|
`import_leads({ campaignOfferId })` for Signal Discovery unless selected posts
|
|
56
56
|
already exist on the campaign. Provider import materializes the source lead
|
|
57
57
|
list from the approved source-capacity plan; it is not the same target as the
|
|
58
|
-
default
|
|
58
|
+
default internal campaign-table execution slice.
|
|
59
59
|
- **Supplied LinkedIn profile CSV** — confirm `load_csv_linkedin_leads` only
|
|
60
60
|
after the user approves that supplied-list source. Batch/materialize the
|
|
61
61
|
uploaded CSV into a Sellable lead-list table. Persist the returned
|
|
@@ -74,7 +74,7 @@ Supported branches:
|
|
|
74
74
|
its `domainFilterId`, run a campaign-associated Prospeo people search with
|
|
75
75
|
`campaignOfferId`, provider prompt preflight, and `domainFilterId`, then
|
|
76
76
|
materialize the source list from that search before copying the confirmed
|
|
77
|
-
list into the campaign table and processing the first
|
|
77
|
+
list into the campaign table and processing the first internal execution slice.
|
|
78
78
|
|
|
79
79
|
## Campaign-Attached Source Contract
|
|
80
80
|
|
|
@@ -114,7 +114,7 @@ import_leads({
|
|
|
114
114
|
|
|
115
115
|
Provider is inherited from the selected source decision (not re-selected here)
|
|
116
116
|
and should already be saved on the campaign before import. For Sales Nav and
|
|
117
|
-
Prospeo, `<sourceCandidateTarget>` is not the
|
|
117
|
+
Prospeo, `<sourceCandidateTarget>` is not the internal campaign-table execution slice. It is
|
|
118
118
|
the source-list export/materialization count from the approved source math. Aim
|
|
119
119
|
for about 1,000 source contacts by default and use the provider cap internally
|
|
120
120
|
when the raw pool is larger. If projected good fits remain below the target,
|
|
@@ -133,11 +133,11 @@ count. The planning floor is 10% projected fit after cleanup; if Signal
|
|
|
133
133
|
Discovery falls below that floor during the pre-scrape sample, revise the source
|
|
134
134
|
plan before importing. After an approved scrape starts, do not discard a nonempty
|
|
135
135
|
completed source list just because it lands below the source-candidate target:
|
|
136
|
-
confirm/copy the completed list for
|
|
137
|
-
or switch provider if the
|
|
136
|
+
confirm/copy the completed list for campaign setup, then add more posts
|
|
137
|
+
or switch provider if the source quality or scale is not enough. The subsequent
|
|
138
138
|
`confirm_lead_list` call uses `reviewBatchLimit: 15`. It copies the confirmed
|
|
139
139
|
source rows into the campaign table and returns only the first 15 rows as the
|
|
140
|
-
|
|
140
|
+
internal campaign-table execution slice.
|
|
141
141
|
|
|
142
142
|
Harvest-specific interpretation: Signal Discovery post comments and reactions
|
|
143
143
|
are paged from Harvest at about 100 records per page, with production caps of
|
|
@@ -145,12 +145,12 @@ are paged from Harvest at about 100 records per page, with production caps of
|
|
|
145
145
|
headline-passing candidates after that scrape. Therefore `71 source rows` means
|
|
146
146
|
71 candidates passed headline/list filtering and were inserted; it does not
|
|
147
147
|
mean the post scrape stopped after 71 raw engagers. Treat raw visible engagement,
|
|
148
|
-
raw fetched pages, inserted source rows, and the
|
|
148
|
+
raw fetched pages, inserted source rows, and the internal campaign-table execution slice as
|
|
149
149
|
separate numbers.
|
|
150
150
|
|
|
151
151
|
For supplied direct lists, `confirm_lead_list` should receive
|
|
152
152
|
`reviewBatchLimit: 15` so the campaign table can hold the confirmed list while
|
|
153
|
-
the first 15 rows drive the
|
|
153
|
+
the first 15 rows drive the internal setup flow.
|
|
154
154
|
|
|
155
155
|
## `mode=add` Two-Step Handshake
|
|
156
156
|
|
|
@@ -241,7 +241,7 @@ cannot scale further without a new source lane.
|
|
|
241
241
|
- `import_leads` is allowed immediately after the concrete source-action
|
|
242
242
|
approval. It materializes the source list and then `confirm_lead_list` copies
|
|
243
243
|
the confirmed source rows into the campaign table while returning only the
|
|
244
|
-
first 15 rows for the
|
|
244
|
+
first 15 rows for the internal campaign-table execution slice. Enrichment and fit
|
|
245
245
|
scoring wait for saved rubrics/run conditions; message cells wait for the
|
|
246
246
|
approved message set.
|
|
247
247
|
- Step 13 MUST reuse an approved source already attached with `campaignOfferId`
|
|
@@ -10,7 +10,7 @@ to `awaiting-user-greenlight`, and on every resume into Step 15.
|
|
|
10
10
|
## Principle
|
|
11
11
|
|
|
12
12
|
Generate Message cells are cascade-scoped. If Step 14's rubric flips rows from
|
|
13
|
-
pending → passed AFTER Step 15 first observes messages for the
|
|
13
|
+
pending → passed AFTER Step 15 first observes messages for the initial campaign rows, the
|
|
14
14
|
new rows can sit pending with no message. That must not block the first review
|
|
15
15
|
handoff. Step 15 opens review as soon as one passing generated message exists;
|
|
16
16
|
late-passed rows can be re-cascaded after explicit user continuation or resume.
|
|
@@ -24,7 +24,7 @@ flat at 257. The new rows never got messages.
|
|
|
24
24
|
Re-cascade runs whenever ALL of the following are true:
|
|
25
25
|
|
|
26
26
|
1. The user has already approved the first generated message or explicitly asked
|
|
27
|
-
to continue processing more
|
|
27
|
+
to continue processing more campaign rows.
|
|
28
28
|
2. A subsequent check of rubric state shows rows that were pending at
|
|
29
29
|
first message-generation pass are now passed.
|
|
30
30
|
3. Those newly-passed rows do NOT yet have generated messages
|
|
@@ -49,13 +49,13 @@ states.
|
|
|
49
49
|
|
|
50
50
|
## Stages
|
|
51
51
|
|
|
52
|
-
| stage | UI label
|
|
53
|
-
| -------------- |
|
|
54
|
-
| `brief-review` | Brief review
|
|
55
|
-
| `find-leads` | Find Leads
|
|
56
|
-
| `review-batch` |
|
|
57
|
-
| `fit-message` | Fit + message
|
|
58
|
-
| `review-ready` | Review ready
|
|
52
|
+
| stage | UI label | Next |
|
|
53
|
+
| -------------- | -------------- | -------------- |
|
|
54
|
+
| `brief-review` | Brief review | Find Leads |
|
|
55
|
+
| `find-leads` | Find Leads | Campaign setup |
|
|
56
|
+
| `review-batch` | Campaign setup | Fit + message |
|
|
57
|
+
| `fit-message` | Fit + message | Review ready |
|
|
58
|
+
| `review-ready` | Review ready | Validation |
|
|
59
59
|
|
|
60
60
|
## Examples
|
|
61
61
|
|
|
@@ -138,7 +138,7 @@ Search iteration:
|
|
|
138
138
|
"stage": "find-leads",
|
|
139
139
|
"headline": "Tightening the search",
|
|
140
140
|
"visibleState": "The first Signal Discovery search was broad, so Codex is trying a narrower Claude Code founder lane.",
|
|
141
|
-
"agentIntent": "It is sampling a few engagers before scraping so the
|
|
141
|
+
"agentIntent": "It is sampling a few engagers before scraping so the source quality stays on-brief.",
|
|
142
142
|
"nextAction": "Review source math"
|
|
143
143
|
}
|
|
144
144
|
```
|
|
@@ -165,9 +165,9 @@ Review/process sample:
|
|
|
165
165
|
```json
|
|
166
166
|
{
|
|
167
167
|
"stage": "review-batch",
|
|
168
|
-
"headline": "Preparing
|
|
169
|
-
"visibleState": "This page shows the confirmed source leads. Codex will process the
|
|
170
|
-
"agentIntent": "Codex is preparing
|
|
168
|
+
"headline": "Preparing campaign setup",
|
|
169
|
+
"visibleState": "This page shows the confirmed source leads. Codex will process the initial campaign rows for setup.",
|
|
170
|
+
"agentIntent": "Codex is preparing filters and messages from those leads.",
|
|
171
171
|
"nextAction": "Fit + message"
|
|
172
172
|
}
|
|
173
173
|
```
|
|
@@ -179,8 +179,8 @@ Source approved and import starting:
|
|
|
179
179
|
"stage": "review-batch",
|
|
180
180
|
"headline": "Copying source leads",
|
|
181
181
|
"visibleState": "The browser is still showing the approved LinkedIn Engagement source candidates.",
|
|
182
|
-
"agentIntent": "Codex is copying the confirmed source into the campaign and will process only the
|
|
183
|
-
"nextAction": "
|
|
182
|
+
"agentIntent": "Codex is copying the confirmed source into the campaign and will process only the internal execution slice for setup.",
|
|
183
|
+
"nextAction": "Campaign setup ready"
|
|
184
184
|
}
|
|
185
185
|
```
|
|
186
186
|
|
|
@@ -282,8 +282,8 @@ Blocked/recovering:
|
|
|
282
282
|
```json
|
|
283
283
|
{
|
|
284
284
|
"stage": "review-batch",
|
|
285
|
-
"headline": "Fixing
|
|
286
|
-
"visibleState": "The browser is not showing
|
|
285
|
+
"headline": "Fixing campaign setup",
|
|
286
|
+
"visibleState": "The browser is not showing campaign rows yet.",
|
|
287
287
|
"agentIntent": "Codex is reconnecting the campaign state before moving forward.",
|
|
288
288
|
"nextAction": "Fit + message",
|
|
289
289
|
"blockedReason": "Campaign batch is not ready yet."
|