@sellable/mcp 0.1.151 → 0.1.152

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 (35) hide show
  1. package/README.md +4 -3
  2. package/agents/post-find-leads-filter-scout.md +5 -4
  3. package/agents/post-find-leads-message-scout.md +15 -14
  4. package/agents/source-scout-linkedin-engagement.md +6 -5
  5. package/agents/source-scout-prospeo-contact.md +4 -4
  6. package/agents/source-scout-sales-nav.md +4 -4
  7. package/dist/index-dev.js +0 -0
  8. package/dist/index.js +0 -0
  9. package/dist/tools/cells.js +1 -1
  10. package/dist/tools/leads.d.ts +36 -3
  11. package/dist/tools/leads.js +83 -71
  12. package/dist/tools/prompts.js +9 -9
  13. package/dist/tools/registry.d.ts +17 -0
  14. package/dist/tools/rubrics.js +23 -20
  15. package/package.json +1 -1
  16. package/skills/create-campaign/SKILL.md +59 -56
  17. package/skills/create-campaign-v2/SKILL.md +43 -42
  18. package/skills/create-campaign-v2/SOUL.md +16 -13
  19. package/skills/create-campaign-v2/core/auto-execute.README.md +16 -17
  20. package/skills/create-campaign-v2/core/auto-execute.yaml +8 -7
  21. package/skills/create-campaign-v2/core/flow.v2.json +81 -149
  22. package/skills/create-campaign-v2/core/policy.md +13 -12
  23. package/skills/create-campaign-v2/references/approval-gate-framing.md +4 -3
  24. package/skills/create-campaign-v2/references/filter-leads.md +5 -4
  25. package/skills/create-campaign-v2/references/lead-validation-preview.md +2 -2
  26. package/skills/create-campaign-v2/references/sample-validation-loop.md +32 -27
  27. package/skills/create-campaign-v2/references/step-13-import-leads.md +29 -28
  28. package/skills/create-campaign-v2/references/watch-guide-narration.md +27 -28
  29. package/skills/create-campaign-v2-tail/SKILL.md +44 -44
  30. package/skills/create-rubric/SKILL.md +5 -5
  31. package/skills/find-leads/SKILL.md +2 -2
  32. package/skills/generate-messages/SKILL.md +2 -1
  33. package/skills/providers/prospeo.md +3 -3
  34. package/skills/providers/sales-nav.md +7 -7
  35. package/skills/providers/signal-discovery.md +11 -11
@@ -14,10 +14,11 @@
14
14
  version: 1
15
15
 
16
16
  import:
17
- # Initial review batch imported in Step 13 before the sample validation
18
- # loop. Import + enrichment must never exceed this cap before the user
19
- # reviews the sample and explicitly asks to expand.
20
- importLimit: 25
17
+ # Initial review/process sample used after the confirmed source list is copied
18
+ # into the campaign. Enrichment must never exceed this cap before the message
19
+ # template is approved and the sample proves at least one passing generated
20
+ # message.
21
+ importLimit: 15
21
22
  # Provider is inherited from the campaign-attached source association created
22
23
  # during find-leads. Step 13 may re-run provider preflight in memory, but it
23
24
  # does not choose a new source.
@@ -27,11 +28,11 @@ sample:
27
28
  # Rows pulled from the imported cohort for the validation loop. In v2 this
28
29
  # equals the review-batch cap so the user sees a focused first test batch
29
30
  # without spending credits on hundreds of rows.
30
- sampleSize: 25
31
+ sampleSize: 15
31
32
  # Projected first-batch passing count required to proceed to sample
32
33
  # messaging. This is not approval to scale the full source list.
33
34
  # projectedPass = round(passInSample / sampleSize * importLimit).
34
- minProjectedPass: 5
35
+ minProjectedPass: 1
35
36
  # Hard cap on revision loops before escalating to the user. On a stale
36
37
  # resume the counter does NOT reset — the 3-round cap holds across
37
38
  # sessions.
@@ -106,7 +107,7 @@ handoff:
106
107
  # Orientation surfaced in Step 16 ("awaiting-user-greenlight") along with
107
108
  # the watch link. Keep this short and user-facing.
108
109
  orientation: >-
109
- Review the first 25 enriched leads and messages. If they look good,
110
+ Review the first generated passing message. If it looks good,
110
111
  attach a sender in Settings, accept the recommended sequence, and start
111
112
  the campaign without spending credits on more leads first.
112
113
 
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "version": "v2.1-compact",
3
3
  "workflow": "create-campaign-v2",
4
- "principle": "CampaignOffer state and the watch link are canonical from the first brief onward. The active customer path is shell-first and state-first: create the watchable campaign shell with the brief, attach source/search state to that CampaignOffer, import one bounded review batch, persist rubrics, wait on Filter Leads for approved message-template review, save the approved template, validate the bounded review batch, generate and review bounded messages, then hand off to Settings, sequence, and explicit start.",
5
- "normalCustomerPath": "Use campaign state, MCP tool responses, and concise watchNarration. Do not create, read, link, or surface local draft files in normal customer runs.",
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.",
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",
8
8
  "tailSubskill": "create-campaign-v2-tail",
@@ -63,9 +63,7 @@
63
63
  "references/lead-validation-preview.md",
64
64
  "references/step-13-import-leads.md"
65
65
  ],
66
- "filter": [
67
- "references/filter-leads.md"
68
- ],
66
+ "filter": ["references/filter-leads.md"],
69
67
  "message": [],
70
68
  "tail": [
71
69
  "references/sample-validation-loop.md",
@@ -76,7 +74,7 @@
76
74
  "safetyBoundaries": [
77
75
  "Do not call list_senders before Settings after message approval.",
78
76
  "Do not import leads until the source decision is approved.",
79
- "Do not queue cells until the bounded review batch exists and the message/filter gates are satisfied.",
77
+ "Do not queue cells until confirmed source rows exist in the campaign and the message/filter gates are satisfied.",
80
78
  "Do not call start_campaign until the user explicitly confirms launch.",
81
79
  "Do not use local files as durable state in normal customer runs."
82
80
  ],
@@ -174,10 +172,7 @@
174
172
  "currentStep": "create-offer",
175
173
  "watchNarration.stage": "brief"
176
174
  },
177
- "capture": [
178
- "campaignId",
179
- "watchUrl"
180
- ],
175
+ "capture": ["campaignId", "watchUrl"],
181
176
  "canonicalStateWrites": [
182
177
  "campaignId",
183
178
  "watchUrl",
@@ -218,11 +213,7 @@
218
213
  "queue_cells",
219
214
  "start_campaign"
220
215
  ],
221
- "waitFor": [
222
- "campaign_shell_created",
223
- "brief_ready",
224
- "confirm_with_user"
225
- ],
216
+ "waitFor": ["campaign_shell_created", "brief_ready", "confirm_with_user"],
226
217
  "transitions": {
227
218
  "campaign_shell_created": "brief-review",
228
219
  "brief_ready": "brief-review",
@@ -240,11 +231,7 @@
240
231
  {
241
232
  "action": "ask_brief_choice",
242
233
  "uses": "request_user_input",
243
- "choices": [
244
- "Approve brief",
245
- "Revise brief",
246
- "Pause here"
247
- ]
234
+ "choices": ["Approve brief", "Revise brief", "Pause here"]
248
235
  }
249
236
  ],
250
237
  "requiredCampaignState": [
@@ -266,11 +253,7 @@
266
253
  "queue_cells",
267
254
  "start_campaign"
268
255
  ],
269
- "waitFor": [
270
- "user_brief_confirmed",
271
- "revise_brief",
272
- "auto_continue"
273
- ],
256
+ "waitFor": ["user_brief_confirmed", "revise_brief", "auto_continue"],
274
257
  "transitions": {
275
258
  "user_brief_confirmed": "find-leads",
276
259
  "revise_brief": "brief-interview",
@@ -300,7 +283,7 @@
300
283
  "fallback lane if the first lane is weak",
301
284
  "what approval authorizes"
302
285
  ],
303
- "approvalAuthorizes": "source scouting/search only; no lead import, review-batch creation, filtering, messaging, sequence, or launch"
286
+ "approvalAuthorizes": "source scouting/search only; no import/send"
304
287
  },
305
288
  "defaultWhenSourceUnspecified": [
306
289
  "signal-discovery",
@@ -341,6 +324,8 @@
341
324
  {
342
325
  "action": "show_pre_scout_source_recommendation",
343
326
  "uses": "request_user_input",
327
+ "oneShot": true,
328
+ "skipIf": "approved or leadSourceProvider",
344
329
  "requiredBeforeTools": [
345
330
  "get_provider_prompt",
346
331
  "search_signals",
@@ -406,11 +391,7 @@
406
391
  "stopOnFirstViableUnlessComparisonRequested": true
407
392
  }
408
393
  ],
409
- "requiredCampaignState": [
410
- "campaignId",
411
- "campaignBrief",
412
- "currentStep"
413
- ],
394
+ "requiredCampaignState": ["campaignId", "campaignBrief", "currentStep"],
414
395
  "allowedTools": [
415
396
  "get_source_scout_registry",
416
397
  "get_provider_prompt",
@@ -438,11 +419,7 @@
438
419
  "queue_cells",
439
420
  "start_campaign"
440
421
  ],
441
- "waitFor": [
442
- "lead_review_ready",
443
- "revise_brief",
444
- "confirm_with_user"
445
- ],
422
+ "waitFor": ["lead_review_ready", "revise_brief", "confirm_with_user"],
446
423
  "transitions": {
447
424
  "lead_review_ready": "lead-review",
448
425
  "revise_brief": "brief-interview",
@@ -458,9 +435,9 @@
458
435
  "requiredInlineFields": [
459
436
  "primary source and exact filters/recipe",
460
437
  "specific source action awaiting approval",
461
- "for Signal Discovery: Source Recommendation markdown with ~150 good-fit prospects as the target, source-candidate plan ~1,000 raw engagers at a conservative ~15% fit assumption, review checkpoint size, selected-post table, total visible pool, estimated good-fit pool, first pass, and fallback",
438
+ "for Signal Discovery: compact Source Recommendation with target, raw-engager math, selected-post table, review checkpoint, estimated fit, and fallback",
462
439
  "for Signal Discovery: selected post count and target engager/source-candidate volume",
463
- "bounded review batch size",
440
+ "15-row review/process sample size",
464
441
  "runner-up and why it lost",
465
442
  "raw volume",
466
443
  "sampled people",
@@ -475,14 +452,14 @@
475
452
  "uses": "request_user_input",
476
453
  "choices": [
477
454
  "Approve scraping N Signal Discovery posts",
478
- "Run the approved source import for the bounded review batch",
455
+ "Run the approved source import",
479
456
  "Revise source",
480
457
  "Pause here"
481
458
  ],
482
459
  "approvalChoiceLabelsByProvider": {
483
460
  "signal-discovery": "Approve scraping {selectedPostCount} Signal Discovery posts?",
484
- "sales-nav": "Import the approved Sales Nav review batch",
485
- "prospeo": "Import the approved Prospeo review batch"
461
+ "sales-nav": "Import the approved Sales Nav source list",
462
+ "prospeo": "Import the approved Prospeo source list"
486
463
  },
487
464
  "postApprovalContract": {
488
465
  "singleUseApproval": true,
@@ -491,8 +468,8 @@
491
468
  "show_source_decision_card",
492
469
  "ask_source_review_choice"
493
470
  ],
494
- "requiredNextActionAfterApproval": "acknowledge in one sentence, then call import_leads immediately",
495
- "signalDiscoveryNextTool": "import_leads({ campaignOfferId, provider: \"signal-discovery\", targetEngagerCount, maxPostsToScrape, confirmed: true })"
471
+ "requiredNextActionAfterApproval": "ack once; call import_leads immediately",
472
+ "signalDiscoveryNextTool": "import_leads({ provider: \"signal-discovery\", targetEngagerCount, maxPostsToScrape, confirmed: true })"
496
473
  }
497
474
  }
498
475
  ],
@@ -530,7 +507,7 @@
530
507
  },
531
508
  {
532
509
  "id": "auto-execute-leads",
533
- "label": "Import bounded review batch",
510
+ "label": "Materialize confirmed source list",
534
511
  "currentStepValue": "auto-execute-leads",
535
512
  "reference": "references/step-13-import-leads.md",
536
513
  "onEnter": [
@@ -546,10 +523,11 @@
546
523
  "requiredFields": [
547
524
  "campaignOfferId",
548
525
  "selected source/list",
549
- "importLimit"
526
+ "sourceListTarget or targetEngagerCount"
550
527
  ],
551
528
  "requiredValues": {
552
- "importLimit": 25
529
+ "salesNavProspeoDefaultSourceListTarget": 1000,
530
+ "signalDiscoveryDefaultEngagerTarget": 1500
553
531
  },
554
532
  "modeAddHandshake": {
555
533
  "firstCallReturns": "needsModeSelection when adding to an existing campaign-attached list",
@@ -567,10 +545,10 @@
567
545
  "selectedLeadListId",
568
546
  "reviewBatchLimit"
569
547
  ],
570
- "capture": [
571
- "workflowTableId",
572
- "reviewBatchRowIds"
573
- ]
548
+ "requiredValues": {
549
+ "reviewBatchLimit": 15
550
+ },
551
+ "capture": ["workflowTableId", "reviewBatchRowIds"]
574
552
  },
575
553
  {
576
554
  "tool": "wait_for_campaign_table_ready"
@@ -581,9 +559,7 @@
581
559
  "tableId": "{workflowTableId}",
582
560
  "limit": 15
583
561
  },
584
- "capture": [
585
- "reviewBatchRowHash"
586
- ]
562
+ "capture": ["reviewBatchRowHash"]
587
563
  },
588
564
  {
589
565
  "action": "summarize_review_batch_and_advance_to_filter_choice",
@@ -618,9 +594,9 @@
618
594
  "bulk_enrich_with_prospeo",
619
595
  "save_rubrics"
620
596
  ],
621
- "waitFor": "review_batch_imported",
597
+ "waitFor": "source_list_confirmed_and_review_sample_ready",
622
598
  "transitions": {
623
- "review_batch_imported": "filter-choice",
599
+ "source_list_confirmed_and_review_sample_ready": "filter-choice",
624
600
  "escalation_triggered": "escalation"
625
601
  }
626
602
  },
@@ -639,11 +615,7 @@
639
615
  {
640
616
  "action": "ask_filter_choice",
641
617
  "uses": "request_user_input",
642
- "choices": [
643
- "Use filters",
644
- "Skip filters",
645
- "Revise source"
646
- ]
618
+ "choices": ["Use filters", "Skip filters", "Revise source"]
647
619
  }
648
620
  ],
649
621
  "hardRules": [
@@ -679,11 +651,7 @@
679
651
  "start_campaign",
680
652
  "generate_messages"
681
653
  ],
682
- "waitFor": [
683
- "filters_enabled",
684
- "filters_skipped",
685
- "revise_leads"
686
- ],
654
+ "waitFor": ["filters_enabled", "filters_skipped", "revise_leads"],
687
655
  "transitions": {
688
656
  "filters_enabled": "post-lead-workstreams",
689
657
  "filters_skipped": "message-generation",
@@ -749,16 +717,19 @@
749
717
  "action": "save_filter_rubrics_to_campaign",
750
718
  "tool": "save_rubrics",
751
719
  "when": "filters_enabled and rubrics are production-shaped",
752
- "requiredFields": [
753
- "campaignOfferId",
754
- "leadScoringRubrics"
755
- ],
720
+ "requiredFields": ["campaignOfferId", "leadScoringRubrics"],
756
721
  "writesCampaignState": "leadScoringRubrics",
757
722
  "requiredSideEffects": {
758
723
  "enableICPFilters": true,
759
- "currentStep": "apply-icp-rubric",
760
- "watchNarration.headline": "Filter rules saved"
724
+ "currentStep": "create-icp-rubric",
725
+ "watchNarration.headline": "Filter rules saved for review"
761
726
  }
727
+ },
728
+ {
729
+ "action": "ask_filter_rubric_review_choice",
730
+ "uses": "request_user_input",
731
+ "choices": ["Approve filters", "Revise filters", "Pause"],
732
+ "purpose": "let the user read saved rubrics before Filter Leads or enrichment"
762
733
  }
763
734
  ],
764
735
  "requiredCampaignState": [
@@ -792,13 +763,14 @@
792
763
  "generate_messages"
793
764
  ],
794
765
  "waitFor": [
795
- "post_lead_workstreams_ready",
766
+ "filter_rubrics_approved",
796
767
  "revise_leads",
797
768
  "revise_rubric",
798
769
  "revise_messaging"
799
770
  ],
800
771
  "hardRules": [
801
- "after_save_rubrics_currentStep_must_be_apply-icp-rubric",
772
+ "after_save_rubrics_currentStep_must_stay_create-icp-rubric_until_filter_approval",
773
+ "filter_approval_required_before_apply-icp-rubric_or_queue_cells",
802
774
  "do_not_move_browser_to_messages_until_filter_leads_step_is_current_or_filters_are_explicitly_skipped",
803
775
  "no_post_lead_worker_or_deep_prompt_before_filter_choice",
804
776
  "lead_fit_builder_starts_only_after_filters_enabled",
@@ -806,7 +778,7 @@
806
778
  "msg_draft_no_cells"
807
779
  ],
808
780
  "transitions": {
809
- "post_lead_workstreams_ready": "message-generation",
781
+ "filter_rubrics_approved": "message-generation",
810
782
  "revise_leads": "find-leads",
811
783
  "revise_rubric": "filter-rubric",
812
784
  "revise_messaging": "message-generation",
@@ -826,22 +798,21 @@
826
798
  },
827
799
  {
828
800
  "tool": "save_rubrics",
829
- "requiredFields": [
830
- "campaignOfferId",
831
- "leadScoringRubrics"
832
- ],
801
+ "requiredFields": ["campaignOfferId", "leadScoringRubrics"],
833
802
  "writesCampaignState": "leadScoringRubrics",
834
803
  "requiredSideEffects": {
835
804
  "enableICPFilters": true,
836
- "currentStep": "apply-icp-rubric",
837
- "watchNarration.headline": "Filter rules saved"
805
+ "currentStep": "create-icp-rubric",
806
+ "watchNarration.headline": "Filter rules saved for review"
838
807
  }
808
+ },
809
+ {
810
+ "action": "ask_filter_rubric_review_choice",
811
+ "uses": "request_user_input",
812
+ "choices": ["Approve filters", "Revise filters", "Pause"]
839
813
  }
840
814
  ],
841
- "requiredCampaignState": [
842
- "campaignId",
843
- "workflowTableId"
844
- ],
815
+ "requiredCampaignState": ["campaignId", "workflowTableId"],
845
816
  "allowedTools": [
846
817
  "get_subskill_asset",
847
818
  "save_rubrics",
@@ -859,13 +830,13 @@
859
830
  "check_rubric"
860
831
  ],
861
832
  "waitFor": [
862
- "lead_filter_ready",
833
+ "filter_rubrics_approved",
863
834
  "revise_leads",
864
835
  "confirm_with_user",
865
836
  "auto_continue"
866
837
  ],
867
838
  "transitions": {
868
- "lead_filter_ready": "message-generation",
839
+ "filter_rubrics_approved": "message-generation",
869
840
  "revise_leads": "find-leads",
870
841
  "confirm_with_user": "message-generation",
871
842
  "auto_continue": "message-generation"
@@ -879,7 +850,7 @@
879
850
  "action": "set_message_review_visible_step_by_filter_choice",
880
851
  "tool": "update_campaign",
881
852
  "branchRules": [
882
- "yes: currentStep=apply-icp-rubric; wait on Filter Leads",
853
+ "yes after filter approval: currentStep=apply-icp-rubric; wait on Filter Leads",
883
854
  "no: currentStep=messages; message review"
884
855
  ],
885
856
  "watchNarration.stage": "fit-message"
@@ -910,9 +881,9 @@
910
881
  "request_user_input"
911
882
  ],
912
883
  "toolRules": [
913
- "Message Draft Builder must run as the background post-find-leads-message-scout when the host exposes it. If the host cannot launch the agent, the parent-thread fallback must execute the same full get_subskill_prompt({ subskillName: \"generate-messages\" }) from live state before drafting.",
914
- "Do not use brief.md, lead-review.md, or lead-sample.json as required live state; those files are optional debug context only.",
915
- "The messageDraftRecommendation must return templateRecommendation, tokenFillRules, renderedSample, concerns, status, basisToken, outputAt, outputHash, and error or retry detail.",
884
+ "Run post-find-leads-message-scout when available; otherwise parent fallback must load get_subskill_prompt({ subskillName: \"generate-messages\" }) from live state.",
885
+ "brief.md, lead-review.md, and lead-sample.json are optional debug context only.",
886
+ "messageDraftRecommendation returns templateRecommendation, tokenFillRules, renderedSample, concerns, status, basisToken, outputAt, outputHash, and error/retry detail.",
916
887
  "If campaign/source/table/review-batch basis does not match, classify the output stale or blocked."
917
888
  ],
918
889
  "doNotAllow": [
@@ -976,10 +947,7 @@
976
947
  {
977
948
  "action": "ask_message_review_choice",
978
949
  "uses": "request_user_input",
979
- "choices": [
980
- "approve-message",
981
- "revise-messaging"
982
- ]
950
+ "choices": ["approve-message", "revise-messaging"]
983
951
  },
984
952
  {
985
953
  "action": "sync_approved_message_set_to_campaign_brief",
@@ -1004,9 +972,7 @@
1004
972
  "request_user_input",
1005
973
  "update_campaign_brief",
1006
974
  "update_campaign",
1007
- "get_rows_minimal",
1008
- "queue_cells",
1009
- "wait_for_rubric_results"
975
+ "get_rows_minimal"
1010
976
  ],
1011
977
  "doNotAllow": [
1012
978
  "create_campaign",
@@ -1016,10 +982,7 @@
1016
982
  "confirm_lead_list",
1017
983
  "start_campaign"
1018
984
  ],
1019
- "waitFor": [
1020
- "message_approved",
1021
- "revise_messaging"
1022
- ],
985
+ "waitFor": ["message_approved", "revise_messaging"],
1023
986
  "transitions": {
1024
987
  "message_approved": "validate-sample",
1025
988
  "revise_messaging": "message-generation"
@@ -1027,10 +990,10 @@
1027
990
  },
1028
991
  {
1029
992
  "id": "validate-sample",
1030
- "label": "Validate bounded review batch",
993
+ "label": "Validate first review/process sample",
1031
994
  "currentStepValue": "apply-icp-rubric",
1032
995
  "reference": "references/sample-validation-loop.md",
1033
- "visibleStepRule": "This is the same Filter Leads screen reached by save_rubrics. Do not route away from or back to Filter Leads on approve-message; save the approved template, refresh watch narration on apply-icp-rubric, then queue the bounded Enrich Prospect cells.",
996
+ "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.",
1034
997
  "onEnter": [
1035
998
  {
1036
999
  "tool": "update_campaign",
@@ -1043,13 +1006,13 @@
1043
1006
  },
1044
1007
  {
1045
1008
  "tool": "queue_cells",
1046
- "purpose": "queue ICP/enrichment cells for the bounded review batch only",
1009
+ "purpose": "queue ICP/enrichment cells for the first 15 review/process rows only",
1047
1010
  "requiredFields": [
1048
1011
  "workflowTableId",
1049
1012
  "reviewBatchRowIds",
1050
1013
  "cellTypes"
1051
1014
  ],
1052
- "targetCountSource": "reviewBatchRowIds.length"
1015
+ "targetCountSource": "reviewBatchRowIds.length (default 15)"
1053
1016
  },
1054
1017
  {
1055
1018
  "tool": "wait_for_campaign_table_ready",
@@ -1085,7 +1048,8 @@
1085
1048
  "requiredCampaignState": [
1086
1049
  "campaignId",
1087
1050
  "workflowTableId",
1088
- "approvedMessageTemplate"
1051
+ "approvedMessageTemplate",
1052
+ "filterRubricsApproved when enableICPFilters=true"
1089
1053
  ],
1090
1054
  "allowedTools": [
1091
1055
  "get_subskill_asset",
@@ -1111,10 +1075,7 @@
1111
1075
  "timeout_never_repeats_without_customer_handoff",
1112
1076
  "timeout_or_underfloor_sample_never_advances_to_settings"
1113
1077
  ],
1114
- "waitFor": [
1115
- "sample_validated",
1116
- "sample_revision_required"
1117
- ],
1078
+ "waitFor": ["sample_validated", "sample_revision_required"],
1118
1079
  "transitions": {
1119
1080
  "sample_validated": "auto-execute-messaging",
1120
1081
  "sample_revision_required": "lead-review",
@@ -1229,10 +1190,7 @@
1229
1190
  "opus_reserved_for_highest_value_subset",
1230
1191
  "proposed_token_never_persisted_in_rewrite"
1231
1192
  ],
1232
- "waitFor": [
1233
- "generated_messages_approved",
1234
- "sample_revision_required"
1235
- ],
1193
+ "waitFor": ["generated_messages_approved", "sample_revision_required"],
1236
1194
  "transitions": {
1237
1195
  "generated_messages_approved": "awaiting-user-greenlight",
1238
1196
  "revise_filters": "filter-rubric",
@@ -1287,9 +1245,7 @@
1287
1245
  "tool": "update_campaign",
1288
1246
  "when": "user selected an available connected sender",
1289
1247
  "requiredValues": {
1290
- "senderIds": [
1291
- "{selectedSenderId}"
1292
- ],
1248
+ "senderIds": ["{selectedSenderId}"],
1293
1249
  "currentStep": "sequence",
1294
1250
  "watchNarration.stage": "review-ready"
1295
1251
  },
@@ -1309,11 +1265,7 @@
1309
1265
  "action": "ask_final_launch_greenlight",
1310
1266
  "uses": "request_user_input",
1311
1267
  "singleChoice": true,
1312
- "choices": [
1313
- "Start campaign",
1314
- "Review campaign first",
1315
- "Pause here"
1316
- ],
1268
+ "choices": ["Start campaign", "Review campaign first", "Pause here"],
1317
1269
  "onUserStart": "claude-greenlight"
1318
1270
  }
1319
1271
  ],
@@ -1326,10 +1278,7 @@
1326
1278
  "AskUserQuestion",
1327
1279
  "request_user_input"
1328
1280
  ],
1329
- "doNotAllow": [
1330
- "start_campaign",
1331
- "import_leads"
1332
- ],
1281
+ "doNotAllow": ["start_campaign", "import_leads"],
1333
1282
  "autoStart": false,
1334
1283
  "watchRequired": true,
1335
1284
  "waitFor": [
@@ -1369,9 +1318,7 @@
1369
1318
  },
1370
1319
  {
1371
1320
  "tool": "start_campaign",
1372
- "requiredFields": [
1373
- "campaignId"
1374
- ],
1321
+ "requiredFields": ["campaignId"],
1375
1322
  "persistsCurrentStep": "running",
1376
1323
  "watchNarrationRule": "After start_campaign succeeds, the running state must say the final greenlight was accepted, the campaign is now live/running, and the user can watch progress from the campaign."
1377
1324
  }
@@ -1401,28 +1348,16 @@
1401
1348
  "action": "surface_campaign_live_confirmation"
1402
1349
  }
1403
1350
  ],
1404
- "allowedTools": [
1405
- "get_campaign",
1406
- "AskUserQuestion",
1407
- "request_user_input"
1408
- ],
1409
- "doNotAllow": [
1410
- "start_campaign"
1411
- ],
1351
+ "allowedTools": ["get_campaign", "AskUserQuestion", "request_user_input"],
1352
+ "doNotAllow": ["start_campaign"],
1412
1353
  "terminal": true
1413
1354
  },
1414
1355
  {
1415
1356
  "id": "escalation",
1416
1357
  "label": "Escalation",
1417
1358
  "reference": "references/escalation-ladder.md",
1418
- "allowedTools": [
1419
- "AskUserQuestion",
1420
- "request_user_input"
1421
- ],
1422
- "doNotAllow": [
1423
- "start_campaign",
1424
- "import_leads"
1425
- ],
1359
+ "allowedTools": ["AskUserQuestion", "request_user_input"],
1360
+ "doNotAllow": ["start_campaign", "import_leads"],
1426
1361
  "transitions": {
1427
1362
  "revise_brief": "brief-interview",
1428
1363
  "revise_leads": "find-leads",
@@ -1434,10 +1369,7 @@
1434
1369
  {
1435
1370
  "id": "abort",
1436
1371
  "label": "Abort",
1437
- "allowedTools": [
1438
- "AskUserQuestion",
1439
- "request_user_input"
1440
- ],
1372
+ "allowedTools": ["AskUserQuestion", "request_user_input"],
1441
1373
  "terminal": true
1442
1374
  }
1443
1375
  ]
@@ -36,10 +36,11 @@ mutation gates:
36
36
  plan or explicitly chooses a source.
37
37
  - Do not call `import_leads` or `confirm_lead_list` until the concrete source
38
38
  action is approved.
39
- - Import/confirm only the first bounded review batch before message approval.
40
- - Do not call `queue_cells` until filter choice is resolved, rubrics are saved
41
- when filters are enabled, and the default Use Template path has an approved
42
- message template/token rule set.
39
+ - Copy the confirmed source list into the campaign, but process only the first
40
+ review/process sample before message approval.
41
+ - Do not call `queue_cells` for enrichment/filtering until filters are approved
42
+ when enabled and the default Use Template path has an approved message
43
+ template/token rule set.
43
44
  - Do not attach a sequence or call `start_campaign` until the user explicitly
44
45
  chooses to launch.
45
46
 
@@ -50,13 +51,13 @@ Customer roleplay critique is advisory only. It cannot approve a campaign.
50
51
  Do not run a downstream stage until the matching live state exists:
51
52
 
52
53
  - campaign shell exists before a watch link is shown as active
53
- - selected source/list state exists before importing a review batch
54
- - `workflowTableId` and non-empty bounded review-batch rows exist before filter
54
+ - selected source/list state exists before copying source rows into the campaign
55
+ - `workflowTableId` and non-empty review/process sample rows exist before filter
55
56
  and message branches run
56
- - `leadScoringRubrics` are saved before queueing ICP filter cells when filters
57
+ - `leadScoringRubrics` are saved and approved before Filter Leads when filters
57
58
  are enabled
58
- - approved message template/token rules are written to campaign brief before
59
- queueing Generate Message cells on the default Use Template path
59
+ - approved message template/token rules are written to the campaign brief before
60
+ queueing enrichment, ICP scoring, or Generate Message cells
60
61
 
61
62
  ## 5) Revision Routing
62
63
 
@@ -70,9 +71,9 @@ Revision choices route back to the exact upstream stage:
70
71
 
71
72
  ## 6) Post-Message Tail
72
73
 
73
- After message approval, queue only the bounded review-batch cells needed to move
74
- the watched app through enrichment, ICP filtering, and approved-template
75
- message generation. Keep the tail observable through watch narration.
74
+ After message approval, queue only the first review/process sample cells needed to move
75
+ the watched app through enrichment, ICP filtering, and approved-template message
76
+ generation. Keep the tail observable through watch narration.
76
77
 
77
78
  The tail stops at `awaiting-user-greenlight`. Never call `start_campaign`
78
79
  inside the autonomous tail.
@@ -14,9 +14,10 @@ packet.
14
14
  ## Purpose
15
15
 
16
16
  The approval gate used to be the place where the user authorized
17
- spend/send-adjacent mutation. It is now compatibility-only. New runs import the
18
- bounded review batch after source approval, save rubrics and the approved
19
- message template after post-import review, and only then queue the cascade.
17
+ spend/send-adjacent mutation. It is now compatibility-only. New runs copy the
18
+ confirmed source list into the campaign after source approval, use the first
19
+ review/process sample for post-import review, save rubrics and the approved
20
+ message template, and only then queue the cascade.
20
21
 
21
22
  If `campaign-shell.json` exists, a draft `CampaignOffer` row already exists but
22
23
  must remain non-sendable. If no shell exists, no campaign row exists until the