@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.
Files changed (32) hide show
  1. package/agents/post-find-leads-filter-scout.md +6 -6
  2. package/agents/post-find-leads-message-scout.md +12 -11
  3. package/agents/source-scout-linkedin-engagement.md +3 -3
  4. package/agents/source-scout-prospeo-contact.md +3 -3
  5. package/agents/source-scout-sales-nav.md +3 -3
  6. package/dist/tools/cells.js +1 -1
  7. package/dist/tools/leads.d.ts +1 -0
  8. package/dist/tools/leads.js +51 -24
  9. package/dist/tools/navigation.js +2 -2
  10. package/dist/tools/prompts.js +7 -7
  11. package/dist/tools/readiness.js +2 -2
  12. package/dist/tools/rubrics.js +1 -1
  13. package/package.json +1 -1
  14. package/skills/create-campaign/SKILL.md +52 -21
  15. package/skills/create-campaign-v2/SKILL.md +48 -47
  16. package/skills/create-campaign-v2/SOUL.md +4 -4
  17. package/skills/create-campaign-v2/core/auto-execute.README.md +9 -9
  18. package/skills/create-campaign-v2/core/flow.v2.json +84 -19
  19. package/skills/create-campaign-v2/core/policy.md +1 -1
  20. package/skills/create-campaign-v2/references/approval-gate-framing.md +2 -2
  21. package/skills/create-campaign-v2/references/filter-leads.md +11 -11
  22. package/skills/create-campaign-v2/references/final-handoff-contract.md +4 -4
  23. package/skills/create-campaign-v2/references/sample-validation-loop.md +8 -8
  24. package/skills/create-campaign-v2/references/step-13-import-leads.md +9 -9
  25. package/skills/create-campaign-v2/references/step-15-re-cascade.md +2 -2
  26. package/skills/create-campaign-v2/references/watch-guide-narration.md +15 -15
  27. package/skills/create-campaign-v2-tail/SKILL.md +27 -27
  28. package/skills/create-rubric/SKILL.md +1 -1
  29. package/skills/find-leads/SKILL.md +2 -2
  30. package/skills/providers/prospeo.md +1 -1
  31. package/skills/providers/sales-nav.md +1 -1
  32. 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 15 review rows, save rubrics for approval, approve the message template, then run the bounded filter/message cascade before Settings, sequence, and explicit start.",
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
- "15-row review/process sample size",
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, review-batch row ids/hash",
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/review-batch basis does not match, classify the output stale or blocked."
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 first review/process sample",
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 first 15 review/process rows only",
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 review-batch messages",
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 first review/process sample cells needed to move
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
- review batch will be enriched/messaged before greenlight.
53
- Use the phrase "only the review batch" plainly enough that the operator
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
- - first review/process sample rows, including row ids/hash when available
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 review batch or normal enrichment path, return `confirm-with-user` and
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 review batch make it clearly irrelevant.
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 review batch show adjacent companies that the customer would likely
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
- review batch, or user context when available, plus the general category
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 review batch appears to be the forbidden side,
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 review batch shows that the pattern will leak at meaningful volume
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 review-batch rows.
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 review batch. Preview-card missingness is
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 review-batch evidence contradicts the approved source thesis, do not rewrite
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 review-batch evidence clearly requires it.
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 review batch.
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, review-batch leads, messages, and
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 first review batch
81
- - that only the first review batch was enriched and messaged before
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 sample loop has one job:
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 review sample. If
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 first review/process sample from
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 review sample
60
+ - cohortSize = stats.totalRows of the enrichment batch, or the execution slice
61
61
  count
62
- - default targetCount=15 matches the default review sample, but pass the
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 review sample may return `ready=false`, `reason="timeout"`,
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 review-batch mode, the sample size equals the
215
- import limit, so the projection is the actual review-batch pass count.
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 15-row campaign review/process sample.
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 15 rows.
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 15-row review/process sample. It is
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 the first review sample, then add more posts
137
- or switch provider if the sample quality or scale is not enough. The subsequent
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
- review/process sample.
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 15-row review/process sample as
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 initial approval flow.
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 initial review/process sample. Enrichment and fit
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 review batch, 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 review-batch rows.
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 | Next |
53
- | -------------- | ------------- | ------------- |
54
- | `brief-review` | Brief review | Find Leads |
55
- | `find-leads` | Find Leads | Review batch |
56
- | `review-batch` | Review batch | Fit + message |
57
- | `fit-message` | Fit + message | Review ready |
58
- | `review-ready` | Review ready | Validation |
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 first review sample stays on-brief.",
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 your first sample",
169
- "visibleState": "This page shows the confirmed source leads. Codex will process the first 15 for review.",
170
- "agentIntent": "Codex is preparing the first campaign sample from those leads.",
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 first 15 for review.",
183
- "nextAction": "Review sample ready"
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 the review batch",
286
- "visibleState": "The browser is not showing the campaign batch yet.",
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."