@sellable/mcp 0.1.150 → 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 (37) 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 +17 -16
  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.d.ts +1 -0
  13. package/dist/tools/prompts.js +10 -9
  14. package/dist/tools/registry.d.ts +17 -0
  15. package/dist/tools/rubrics.js +23 -20
  16. package/package.json +1 -1
  17. package/skills/create-campaign/SKILL.md +64 -61
  18. package/skills/create-campaign-v2/SKILL.md +50 -55
  19. package/skills/create-campaign-v2/SOUL.md +16 -13
  20. package/skills/create-campaign-v2/core/auto-execute.README.md +16 -17
  21. package/skills/create-campaign-v2/core/auto-execute.yaml +8 -7
  22. package/skills/create-campaign-v2/core/flow.v2.json +84 -156
  23. package/skills/create-campaign-v2/core/policy.md +13 -12
  24. package/skills/create-campaign-v2/references/approval-gate-framing.md +11 -11
  25. package/skills/create-campaign-v2/references/filter-leads.md +5 -4
  26. package/skills/create-campaign-v2/references/lead-validation-preview.md +2 -2
  27. package/skills/create-campaign-v2/references/sample-validation-loop.md +32 -27
  28. package/skills/create-campaign-v2/references/step-13-import-leads.md +29 -28
  29. package/skills/create-campaign-v2/references/watch-guide-narration.md +27 -28
  30. package/skills/create-campaign-v2-tail/SKILL.md +44 -44
  31. package/skills/create-rubric/SKILL.md +5 -5
  32. package/skills/find-leads/SKILL.md +2 -2
  33. package/skills/generate-messages/SKILL.md +2 -1
  34. package/skills/providers/prospeo.md +3 -3
  35. package/skills/providers/sales-nav.md +7 -7
  36. package/skills/providers/signal-discovery.md +11 -11
  37. package/skills/create-campaign-v2/references/message-review-safety-gate.md +0 -162
@@ -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,12 +63,8 @@
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
- ],
69
- "message": [
70
- "references/message-review-safety-gate.md"
71
- ],
66
+ "filter": ["references/filter-leads.md"],
67
+ "message": [],
72
68
  "tail": [
73
69
  "references/sample-validation-loop.md",
74
70
  "references/step-15-re-cascade.md",
@@ -78,7 +74,7 @@
78
74
  "safetyBoundaries": [
79
75
  "Do not call list_senders before Settings after message approval.",
80
76
  "Do not import leads until the source decision is approved.",
81
- "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.",
82
78
  "Do not call start_campaign until the user explicitly confirms launch.",
83
79
  "Do not use local files as durable state in normal customer runs."
84
80
  ],
@@ -176,10 +172,7 @@
176
172
  "currentStep": "create-offer",
177
173
  "watchNarration.stage": "brief"
178
174
  },
179
- "capture": [
180
- "campaignId",
181
- "watchUrl"
182
- ],
175
+ "capture": ["campaignId", "watchUrl"],
183
176
  "canonicalStateWrites": [
184
177
  "campaignId",
185
178
  "watchUrl",
@@ -220,11 +213,7 @@
220
213
  "queue_cells",
221
214
  "start_campaign"
222
215
  ],
223
- "waitFor": [
224
- "campaign_shell_created",
225
- "brief_ready",
226
- "confirm_with_user"
227
- ],
216
+ "waitFor": ["campaign_shell_created", "brief_ready", "confirm_with_user"],
228
217
  "transitions": {
229
218
  "campaign_shell_created": "brief-review",
230
219
  "brief_ready": "brief-review",
@@ -242,11 +231,7 @@
242
231
  {
243
232
  "action": "ask_brief_choice",
244
233
  "uses": "request_user_input",
245
- "choices": [
246
- "Approve brief",
247
- "Revise brief",
248
- "Pause here"
249
- ]
234
+ "choices": ["Approve brief", "Revise brief", "Pause here"]
250
235
  }
251
236
  ],
252
237
  "requiredCampaignState": [
@@ -268,11 +253,7 @@
268
253
  "queue_cells",
269
254
  "start_campaign"
270
255
  ],
271
- "waitFor": [
272
- "user_brief_confirmed",
273
- "revise_brief",
274
- "auto_continue"
275
- ],
256
+ "waitFor": ["user_brief_confirmed", "revise_brief", "auto_continue"],
276
257
  "transitions": {
277
258
  "user_brief_confirmed": "find-leads",
278
259
  "revise_brief": "brief-interview",
@@ -302,7 +283,7 @@
302
283
  "fallback lane if the first lane is weak",
303
284
  "what approval authorizes"
304
285
  ],
305
- "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"
306
287
  },
307
288
  "defaultWhenSourceUnspecified": [
308
289
  "signal-discovery",
@@ -343,6 +324,8 @@
343
324
  {
344
325
  "action": "show_pre_scout_source_recommendation",
345
326
  "uses": "request_user_input",
327
+ "oneShot": true,
328
+ "skipIf": "approved or leadSourceProvider",
346
329
  "requiredBeforeTools": [
347
330
  "get_provider_prompt",
348
331
  "search_signals",
@@ -408,11 +391,7 @@
408
391
  "stopOnFirstViableUnlessComparisonRequested": true
409
392
  }
410
393
  ],
411
- "requiredCampaignState": [
412
- "campaignId",
413
- "campaignBrief",
414
- "currentStep"
415
- ],
394
+ "requiredCampaignState": ["campaignId", "campaignBrief", "currentStep"],
416
395
  "allowedTools": [
417
396
  "get_source_scout_registry",
418
397
  "get_provider_prompt",
@@ -440,11 +419,7 @@
440
419
  "queue_cells",
441
420
  "start_campaign"
442
421
  ],
443
- "waitFor": [
444
- "lead_review_ready",
445
- "revise_brief",
446
- "confirm_with_user"
447
- ],
422
+ "waitFor": ["lead_review_ready", "revise_brief", "confirm_with_user"],
448
423
  "transitions": {
449
424
  "lead_review_ready": "lead-review",
450
425
  "revise_brief": "brief-interview",
@@ -460,9 +435,9 @@
460
435
  "requiredInlineFields": [
461
436
  "primary source and exact filters/recipe",
462
437
  "specific source action awaiting approval",
463
- "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",
464
439
  "for Signal Discovery: selected post count and target engager/source-candidate volume",
465
- "bounded review batch size",
440
+ "15-row review/process sample size",
466
441
  "runner-up and why it lost",
467
442
  "raw volume",
468
443
  "sampled people",
@@ -477,14 +452,14 @@
477
452
  "uses": "request_user_input",
478
453
  "choices": [
479
454
  "Approve scraping N Signal Discovery posts",
480
- "Run the approved source import for the bounded review batch",
455
+ "Run the approved source import",
481
456
  "Revise source",
482
457
  "Pause here"
483
458
  ],
484
459
  "approvalChoiceLabelsByProvider": {
485
460
  "signal-discovery": "Approve scraping {selectedPostCount} Signal Discovery posts?",
486
- "sales-nav": "Import the approved Sales Nav review batch",
487
- "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"
488
463
  },
489
464
  "postApprovalContract": {
490
465
  "singleUseApproval": true,
@@ -493,8 +468,8 @@
493
468
  "show_source_decision_card",
494
469
  "ask_source_review_choice"
495
470
  ],
496
- "requiredNextActionAfterApproval": "acknowledge in one sentence, then call import_leads immediately",
497
- "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 })"
498
473
  }
499
474
  }
500
475
  ],
@@ -532,7 +507,7 @@
532
507
  },
533
508
  {
534
509
  "id": "auto-execute-leads",
535
- "label": "Import bounded review batch",
510
+ "label": "Materialize confirmed source list",
536
511
  "currentStepValue": "auto-execute-leads",
537
512
  "reference": "references/step-13-import-leads.md",
538
513
  "onEnter": [
@@ -548,10 +523,11 @@
548
523
  "requiredFields": [
549
524
  "campaignOfferId",
550
525
  "selected source/list",
551
- "importLimit"
526
+ "sourceListTarget or targetEngagerCount"
552
527
  ],
553
528
  "requiredValues": {
554
- "importLimit": 25
529
+ "salesNavProspeoDefaultSourceListTarget": 1000,
530
+ "signalDiscoveryDefaultEngagerTarget": 1500
555
531
  },
556
532
  "modeAddHandshake": {
557
533
  "firstCallReturns": "needsModeSelection when adding to an existing campaign-attached list",
@@ -569,10 +545,10 @@
569
545
  "selectedLeadListId",
570
546
  "reviewBatchLimit"
571
547
  ],
572
- "capture": [
573
- "workflowTableId",
574
- "reviewBatchRowIds"
575
- ]
548
+ "requiredValues": {
549
+ "reviewBatchLimit": 15
550
+ },
551
+ "capture": ["workflowTableId", "reviewBatchRowIds"]
576
552
  },
577
553
  {
578
554
  "tool": "wait_for_campaign_table_ready"
@@ -583,9 +559,7 @@
583
559
  "tableId": "{workflowTableId}",
584
560
  "limit": 15
585
561
  },
586
- "capture": [
587
- "reviewBatchRowHash"
588
- ]
562
+ "capture": ["reviewBatchRowHash"]
589
563
  },
590
564
  {
591
565
  "action": "summarize_review_batch_and_advance_to_filter_choice",
@@ -620,9 +594,9 @@
620
594
  "bulk_enrich_with_prospeo",
621
595
  "save_rubrics"
622
596
  ],
623
- "waitFor": "review_batch_imported",
597
+ "waitFor": "source_list_confirmed_and_review_sample_ready",
624
598
  "transitions": {
625
- "review_batch_imported": "filter-choice",
599
+ "source_list_confirmed_and_review_sample_ready": "filter-choice",
626
600
  "escalation_triggered": "escalation"
627
601
  }
628
602
  },
@@ -641,11 +615,7 @@
641
615
  {
642
616
  "action": "ask_filter_choice",
643
617
  "uses": "request_user_input",
644
- "choices": [
645
- "Use filters",
646
- "Skip filters",
647
- "Revise source"
648
- ]
618
+ "choices": ["Use filters", "Skip filters", "Revise source"]
649
619
  }
650
620
  ],
651
621
  "hardRules": [
@@ -681,11 +651,7 @@
681
651
  "start_campaign",
682
652
  "generate_messages"
683
653
  ],
684
- "waitFor": [
685
- "filters_enabled",
686
- "filters_skipped",
687
- "revise_leads"
688
- ],
654
+ "waitFor": ["filters_enabled", "filters_skipped", "revise_leads"],
689
655
  "transitions": {
690
656
  "filters_enabled": "post-lead-workstreams",
691
657
  "filters_skipped": "message-generation",
@@ -751,16 +717,19 @@
751
717
  "action": "save_filter_rubrics_to_campaign",
752
718
  "tool": "save_rubrics",
753
719
  "when": "filters_enabled and rubrics are production-shaped",
754
- "requiredFields": [
755
- "campaignOfferId",
756
- "leadScoringRubrics"
757
- ],
720
+ "requiredFields": ["campaignOfferId", "leadScoringRubrics"],
758
721
  "writesCampaignState": "leadScoringRubrics",
759
722
  "requiredSideEffects": {
760
723
  "enableICPFilters": true,
761
- "currentStep": "apply-icp-rubric",
762
- "watchNarration.headline": "Filter rules saved"
724
+ "currentStep": "create-icp-rubric",
725
+ "watchNarration.headline": "Filter rules saved for review"
763
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"
764
733
  }
765
734
  ],
766
735
  "requiredCampaignState": [
@@ -794,13 +763,14 @@
794
763
  "generate_messages"
795
764
  ],
796
765
  "waitFor": [
797
- "post_lead_workstreams_ready",
766
+ "filter_rubrics_approved",
798
767
  "revise_leads",
799
768
  "revise_rubric",
800
769
  "revise_messaging"
801
770
  ],
802
771
  "hardRules": [
803
- "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",
804
774
  "do_not_move_browser_to_messages_until_filter_leads_step_is_current_or_filters_are_explicitly_skipped",
805
775
  "no_post_lead_worker_or_deep_prompt_before_filter_choice",
806
776
  "lead_fit_builder_starts_only_after_filters_enabled",
@@ -808,7 +778,7 @@
808
778
  "msg_draft_no_cells"
809
779
  ],
810
780
  "transitions": {
811
- "post_lead_workstreams_ready": "message-generation",
781
+ "filter_rubrics_approved": "message-generation",
812
782
  "revise_leads": "find-leads",
813
783
  "revise_rubric": "filter-rubric",
814
784
  "revise_messaging": "message-generation",
@@ -828,22 +798,21 @@
828
798
  },
829
799
  {
830
800
  "tool": "save_rubrics",
831
- "requiredFields": [
832
- "campaignOfferId",
833
- "leadScoringRubrics"
834
- ],
801
+ "requiredFields": ["campaignOfferId", "leadScoringRubrics"],
835
802
  "writesCampaignState": "leadScoringRubrics",
836
803
  "requiredSideEffects": {
837
804
  "enableICPFilters": true,
838
- "currentStep": "apply-icp-rubric",
839
- "watchNarration.headline": "Filter rules saved"
805
+ "currentStep": "create-icp-rubric",
806
+ "watchNarration.headline": "Filter rules saved for review"
840
807
  }
808
+ },
809
+ {
810
+ "action": "ask_filter_rubric_review_choice",
811
+ "uses": "request_user_input",
812
+ "choices": ["Approve filters", "Revise filters", "Pause"]
841
813
  }
842
814
  ],
843
- "requiredCampaignState": [
844
- "campaignId",
845
- "workflowTableId"
846
- ],
815
+ "requiredCampaignState": ["campaignId", "workflowTableId"],
847
816
  "allowedTools": [
848
817
  "get_subskill_asset",
849
818
  "save_rubrics",
@@ -861,13 +830,13 @@
861
830
  "check_rubric"
862
831
  ],
863
832
  "waitFor": [
864
- "lead_filter_ready",
833
+ "filter_rubrics_approved",
865
834
  "revise_leads",
866
835
  "confirm_with_user",
867
836
  "auto_continue"
868
837
  ],
869
838
  "transitions": {
870
- "lead_filter_ready": "message-generation",
839
+ "filter_rubrics_approved": "message-generation",
871
840
  "revise_leads": "find-leads",
872
841
  "confirm_with_user": "message-generation",
873
842
  "auto_continue": "message-generation"
@@ -881,7 +850,7 @@
881
850
  "action": "set_message_review_visible_step_by_filter_choice",
882
851
  "tool": "update_campaign",
883
852
  "branchRules": [
884
- "yes: currentStep=apply-icp-rubric; wait on Filter Leads",
853
+ "yes after filter approval: currentStep=apply-icp-rubric; wait on Filter Leads",
885
854
  "no: currentStep=messages; message review"
886
855
  ],
887
856
  "watchNarration.stage": "fit-message"
@@ -890,8 +859,8 @@
890
859
  "action": "run_or_reconcile_message_draft_builder",
891
860
  "target": "post-find-leads-message-scout",
892
861
  "toolCallRequiredBeforeDraft": [
893
- "get_subskill_prompt({ subskillName: \"generate-messages\", offset, limit }) until hasMore=false",
894
- "parent approval uses references/message-review-safety-gate.md only"
862
+ "run background post-find-leads-message-scout when available",
863
+ "get_subskill_prompt({ subskillName: \"generate-messages\", offset, limit }) until hasMore=false"
895
864
  ],
896
865
  "stateSource": "campaignBrief, source, selectedLeadListId, workflowTableId, review-batch row ids/hash",
897
866
  "outputState": "messageDraftRecommendation"
@@ -905,7 +874,6 @@
905
874
  ],
906
875
  "allowedTools": [
907
876
  "get_subskill_prompt",
908
- "get_subskill_asset",
909
877
  "get_campaign",
910
878
  "get_rows_minimal",
911
879
  "update_campaign",
@@ -913,9 +881,9 @@
913
881
  "request_user_input"
914
882
  ],
915
883
  "toolRules": [
916
- "Message Draft Builder loads full get_subskill_prompt({ subskillName: \"generate-messages\" }) from live state. Parent approval uses message-review-safety-gate only.",
917
- "Do not use brief.md, lead-review.md, or lead-sample.json as required live state; those files are optional debug context only.",
918
- "The compact 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.",
919
887
  "If campaign/source/table/review-batch basis does not match, classify the output stale or blocked."
920
888
  ],
921
889
  "doNotAllow": [
@@ -979,10 +947,7 @@
979
947
  {
980
948
  "action": "ask_message_review_choice",
981
949
  "uses": "request_user_input",
982
- "choices": [
983
- "approve-message",
984
- "revise-messaging"
985
- ]
950
+ "choices": ["approve-message", "revise-messaging"]
986
951
  },
987
952
  {
988
953
  "action": "sync_approved_message_set_to_campaign_brief",
@@ -1005,12 +970,9 @@
1005
970
  "allowedTools": [
1006
971
  "AskUserQuestion",
1007
972
  "request_user_input",
1008
- "get_subskill_asset",
1009
973
  "update_campaign_brief",
1010
974
  "update_campaign",
1011
- "get_rows_minimal",
1012
- "queue_cells",
1013
- "wait_for_rubric_results"
975
+ "get_rows_minimal"
1014
976
  ],
1015
977
  "doNotAllow": [
1016
978
  "create_campaign",
@@ -1020,10 +982,7 @@
1020
982
  "confirm_lead_list",
1021
983
  "start_campaign"
1022
984
  ],
1023
- "waitFor": [
1024
- "message_approved",
1025
- "revise_messaging"
1026
- ],
985
+ "waitFor": ["message_approved", "revise_messaging"],
1027
986
  "transitions": {
1028
987
  "message_approved": "validate-sample",
1029
988
  "revise_messaging": "message-generation"
@@ -1031,10 +990,10 @@
1031
990
  },
1032
991
  {
1033
992
  "id": "validate-sample",
1034
- "label": "Validate bounded review batch",
993
+ "label": "Validate first review/process sample",
1035
994
  "currentStepValue": "apply-icp-rubric",
1036
995
  "reference": "references/sample-validation-loop.md",
1037
- "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.",
1038
997
  "onEnter": [
1039
998
  {
1040
999
  "tool": "update_campaign",
@@ -1047,13 +1006,13 @@
1047
1006
  },
1048
1007
  {
1049
1008
  "tool": "queue_cells",
1050
- "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",
1051
1010
  "requiredFields": [
1052
1011
  "workflowTableId",
1053
1012
  "reviewBatchRowIds",
1054
1013
  "cellTypes"
1055
1014
  ],
1056
- "targetCountSource": "reviewBatchRowIds.length"
1015
+ "targetCountSource": "reviewBatchRowIds.length (default 15)"
1057
1016
  },
1058
1017
  {
1059
1018
  "tool": "wait_for_campaign_table_ready",
@@ -1089,7 +1048,8 @@
1089
1048
  "requiredCampaignState": [
1090
1049
  "campaignId",
1091
1050
  "workflowTableId",
1092
- "approvedMessageTemplate"
1051
+ "approvedMessageTemplate",
1052
+ "filterRubricsApproved when enableICPFilters=true"
1093
1053
  ],
1094
1054
  "allowedTools": [
1095
1055
  "get_subskill_asset",
@@ -1115,10 +1075,7 @@
1115
1075
  "timeout_never_repeats_without_customer_handoff",
1116
1076
  "timeout_or_underfloor_sample_never_advances_to_settings"
1117
1077
  ],
1118
- "waitFor": [
1119
- "sample_validated",
1120
- "sample_revision_required"
1121
- ],
1078
+ "waitFor": ["sample_validated", "sample_revision_required"],
1122
1079
  "transitions": {
1123
1080
  "sample_validated": "auto-execute-messaging",
1124
1081
  "sample_revision_required": "lead-review",
@@ -1233,10 +1190,7 @@
1233
1190
  "opus_reserved_for_highest_value_subset",
1234
1191
  "proposed_token_never_persisted_in_rewrite"
1235
1192
  ],
1236
- "waitFor": [
1237
- "generated_messages_approved",
1238
- "sample_revision_required"
1239
- ],
1193
+ "waitFor": ["generated_messages_approved", "sample_revision_required"],
1240
1194
  "transitions": {
1241
1195
  "generated_messages_approved": "awaiting-user-greenlight",
1242
1196
  "revise_filters": "filter-rubric",
@@ -1291,9 +1245,7 @@
1291
1245
  "tool": "update_campaign",
1292
1246
  "when": "user selected an available connected sender",
1293
1247
  "requiredValues": {
1294
- "senderIds": [
1295
- "{selectedSenderId}"
1296
- ],
1248
+ "senderIds": ["{selectedSenderId}"],
1297
1249
  "currentStep": "sequence",
1298
1250
  "watchNarration.stage": "review-ready"
1299
1251
  },
@@ -1313,11 +1265,7 @@
1313
1265
  "action": "ask_final_launch_greenlight",
1314
1266
  "uses": "request_user_input",
1315
1267
  "singleChoice": true,
1316
- "choices": [
1317
- "Start campaign",
1318
- "Review campaign first",
1319
- "Pause here"
1320
- ],
1268
+ "choices": ["Start campaign", "Review campaign first", "Pause here"],
1321
1269
  "onUserStart": "claude-greenlight"
1322
1270
  }
1323
1271
  ],
@@ -1330,10 +1278,7 @@
1330
1278
  "AskUserQuestion",
1331
1279
  "request_user_input"
1332
1280
  ],
1333
- "doNotAllow": [
1334
- "start_campaign",
1335
- "import_leads"
1336
- ],
1281
+ "doNotAllow": ["start_campaign", "import_leads"],
1337
1282
  "autoStart": false,
1338
1283
  "watchRequired": true,
1339
1284
  "waitFor": [
@@ -1373,9 +1318,7 @@
1373
1318
  },
1374
1319
  {
1375
1320
  "tool": "start_campaign",
1376
- "requiredFields": [
1377
- "campaignId"
1378
- ],
1321
+ "requiredFields": ["campaignId"],
1379
1322
  "persistsCurrentStep": "running",
1380
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."
1381
1324
  }
@@ -1405,28 +1348,16 @@
1405
1348
  "action": "surface_campaign_live_confirmation"
1406
1349
  }
1407
1350
  ],
1408
- "allowedTools": [
1409
- "get_campaign",
1410
- "AskUserQuestion",
1411
- "request_user_input"
1412
- ],
1413
- "doNotAllow": [
1414
- "start_campaign"
1415
- ],
1351
+ "allowedTools": ["get_campaign", "AskUserQuestion", "request_user_input"],
1352
+ "doNotAllow": ["start_campaign"],
1416
1353
  "terminal": true
1417
1354
  },
1418
1355
  {
1419
1356
  "id": "escalation",
1420
1357
  "label": "Escalation",
1421
1358
  "reference": "references/escalation-ladder.md",
1422
- "allowedTools": [
1423
- "AskUserQuestion",
1424
- "request_user_input"
1425
- ],
1426
- "doNotAllow": [
1427
- "start_campaign",
1428
- "import_leads"
1429
- ],
1359
+ "allowedTools": ["AskUserQuestion", "request_user_input"],
1360
+ "doNotAllow": ["start_campaign", "import_leads"],
1430
1361
  "transitions": {
1431
1362
  "revise_brief": "brief-interview",
1432
1363
  "revise_leads": "find-leads",
@@ -1438,10 +1369,7 @@
1438
1369
  {
1439
1370
  "id": "abort",
1440
1371
  "label": "Abort",
1441
- "allowedTools": [
1442
- "AskUserQuestion",
1443
- "request_user_input"
1444
- ],
1372
+ "allowedTools": ["AskUserQuestion", "request_user_input"],
1445
1373
  "terminal": true
1446
1374
  }
1447
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
@@ -33,14 +34,13 @@ Before showing the commit gate, the draft directory must contain all of:
33
34
  - `message-validation.md`
34
35
  - `approval-packet.md`
35
36
 
36
- The current run must also have retrieved message-generation rules before
37
- `message-validation.md`, `approval-packet.md`, or the commit gate is written. In
38
- `create-campaign-v2`, use the compact
39
- `references/message-review-safety-gate.md` asset or the embedded
40
- `post-find-leads-message-scout` prompt. Do not load the full long-form
41
- `generate-messages` subskill for the hosted campaign launch path. If the message
42
- template was written directly from memory or planning artifacts, do not show the
43
- commit gate; route back to message generation.
37
+ The current run must also have retrieved the full message-generation rules
38
+ before `message-validation.md`, `approval-packet.md`, or the commit gate is
39
+ written. In `create-campaign-v2`, use the embedded
40
+ `post-find-leads-message-scout` prompt or load the full long-form
41
+ `generate-messages` subskill. If the message template was written directly from
42
+ memory, checklist instructions, or planning artifacts, do not show the commit
43
+ gate; route back to message generation.
44
44
 
45
45
  `rubric.json` is optional but strongly preferred — when missing, derive it from
46
46
  `lead-filter.md` in the atomic mint step.