@sellable/mcp 0.1.0

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 (200) hide show
  1. package/.claude-plugin/plugin.json +12 -0
  2. package/.mcp.json +9 -0
  3. package/README.md +355 -0
  4. package/dist/api.d.ts +21 -0
  5. package/dist/api.js +73 -0
  6. package/dist/auth.d.ts +60 -0
  7. package/dist/auth.js +246 -0
  8. package/dist/engage-memory.d.ts +63 -0
  9. package/dist/engage-memory.js +354 -0
  10. package/dist/index-dev.d.ts +2 -0
  11. package/dist/index-dev.js +17 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +8 -0
  14. package/dist/server.d.ts +1 -0
  15. package/dist/server.js +499 -0
  16. package/dist/skills.d.ts +11 -0
  17. package/dist/skills.js +97 -0
  18. package/dist/tools/auth.d.ts +30 -0
  19. package/dist/tools/auth.js +124 -0
  20. package/dist/tools/blueprint-commit.d.ts +174 -0
  21. package/dist/tools/blueprint-commit.js +286 -0
  22. package/dist/tools/bootstrap.d.ts +64 -0
  23. package/dist/tools/bootstrap.js +246 -0
  24. package/dist/tools/campaigns.d.ts +589 -0
  25. package/dist/tools/campaigns.js +892 -0
  26. package/dist/tools/cells.d.ts +58 -0
  27. package/dist/tools/cells.js +48 -0
  28. package/dist/tools/context.d.ts +88 -0
  29. package/dist/tools/context.js +271 -0
  30. package/dist/tools/csv-domains.d.ts +73 -0
  31. package/dist/tools/csv-domains.js +464 -0
  32. package/dist/tools/csv-linkedin.d.ts +102 -0
  33. package/dist/tools/csv-linkedin.js +712 -0
  34. package/dist/tools/direct-campaigns.d.ts +240 -0
  35. package/dist/tools/direct-campaigns.js +250 -0
  36. package/dist/tools/engage-bootstrap.d.ts +94 -0
  37. package/dist/tools/engage-bootstrap.js +205 -0
  38. package/dist/tools/engage-discovery.d.ts +78 -0
  39. package/dist/tools/engage-discovery.js +150 -0
  40. package/dist/tools/engage-memory.d.ts +181 -0
  41. package/dist/tools/engage-memory.js +143 -0
  42. package/dist/tools/engage-state.d.ts +72 -0
  43. package/dist/tools/engage-state.js +62 -0
  44. package/dist/tools/enrichment.d.ts +167 -0
  45. package/dist/tools/enrichment.js +174 -0
  46. package/dist/tools/flow-preflight.d.ts +68 -0
  47. package/dist/tools/flow-preflight.js +138 -0
  48. package/dist/tools/framework.d.ts +44 -0
  49. package/dist/tools/framework.js +153 -0
  50. package/dist/tools/interaction-mode.d.ts +27 -0
  51. package/dist/tools/interaction-mode.js +102 -0
  52. package/dist/tools/leads.d.ts +2417 -0
  53. package/dist/tools/leads.js +2307 -0
  54. package/dist/tools/linkedin.d.ts +210 -0
  55. package/dist/tools/linkedin.js +229 -0
  56. package/dist/tools/navigation.d.ts +91 -0
  57. package/dist/tools/navigation.js +381 -0
  58. package/dist/tools/one-off.d.ts +229 -0
  59. package/dist/tools/one-off.js +273 -0
  60. package/dist/tools/processing.d.ts +70 -0
  61. package/dist/tools/processing.js +56 -0
  62. package/dist/tools/prompts.d.ts +211 -0
  63. package/dist/tools/prompts.js +210 -0
  64. package/dist/tools/provider-preflight.d.ts +21 -0
  65. package/dist/tools/provider-preflight.js +59 -0
  66. package/dist/tools/readiness.d.ts +261 -0
  67. package/dist/tools/readiness.js +510 -0
  68. package/dist/tools/rows.d.ts +126 -0
  69. package/dist/tools/rows.js +105 -0
  70. package/dist/tools/rubrics.d.ts +497 -0
  71. package/dist/tools/rubrics.js +681 -0
  72. package/dist/tools/senders.d.ts +44 -0
  73. package/dist/tools/senders.js +69 -0
  74. package/dist/tools/sequencer.d.ts +127 -0
  75. package/dist/tools/sequencer.js +194 -0
  76. package/dist/tools/tables.d.ts +35 -0
  77. package/dist/tools/tables.js +36 -0
  78. package/dist/tools/verify-row.d.ts +36 -0
  79. package/dist/tools/verify-row.js +38 -0
  80. package/dist/tools/workspaces.d.ts +140 -0
  81. package/dist/tools/workspaces.js +139 -0
  82. package/dist/utils/workspace-root.d.ts +1 -0
  83. package/dist/utils/workspace-root.js +39 -0
  84. package/package.json +46 -0
  85. package/skills/building-gtm-tables/SKILL.md +216 -0
  86. package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
  87. package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
  88. package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
  89. package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
  90. package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
  91. package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
  92. package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
  93. package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
  94. package/skills/building-gtm-tables/references/verify-loop.md +74 -0
  95. package/skills/campaign-messages/SKILL.md +173 -0
  96. package/skills/campaign-messages/flow.v1.json +75 -0
  97. package/skills/craft-message/SKILL.md +401 -0
  98. package/skills/create-campaign/ARCHITECTURE.md +232 -0
  99. package/skills/create-campaign/DISCUSS.md +296 -0
  100. package/skills/create-campaign/FLOW_ASCII.md +240 -0
  101. package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
  102. package/skills/create-campaign/README.md +142 -0
  103. package/skills/create-campaign/SKILL.md +286 -0
  104. package/skills/create-campaign/context/README.md +67 -0
  105. package/skills/create-campaign/context/_TEMPLATE.md +12 -0
  106. package/skills/create-campaign/context/context.md +35 -0
  107. package/skills/create-campaign/context/learnings.md +16 -0
  108. package/skills/create-campaign/context/registry.json +19 -0
  109. package/skills/create-campaign/core/flow.v1.json +217 -0
  110. package/skills/create-campaign/core/policy.md +191 -0
  111. package/skills/create-campaign/core/providers/apollo.json +35 -0
  112. package/skills/create-campaign/core/providers/prospeo.json +34 -0
  113. package/skills/create-campaign/core/providers/registry.json +31 -0
  114. package/skills/create-campaign/core/providers/sales-nav.json +37 -0
  115. package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
  116. package/skills/create-campaign/references/brief-template.md +64 -0
  117. package/skills/create-campaign/references/campaign-quality.md +84 -0
  118. package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
  119. package/skills/create-campaign/references/offer-patterns.md +108 -0
  120. package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
  121. package/skills/create-campaign/references/question-examples.md +167 -0
  122. package/skills/create-campaign/references/token-fill-examples.md +81 -0
  123. package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
  124. package/skills/create-campaign-brief/DISCUSS.md +64 -0
  125. package/skills/create-campaign-brief/README.md +176 -0
  126. package/skills/create-campaign-brief/SKILL.md +537 -0
  127. package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
  128. package/skills/create-campaign-brief/references/brief-template.md +220 -0
  129. package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
  130. package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
  131. package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
  132. package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
  133. package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
  134. package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
  135. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
  136. package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
  137. package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
  138. package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
  139. package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
  140. package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
  141. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
  142. package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
  143. package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
  144. package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
  145. package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
  146. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
  147. package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
  148. package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
  149. package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
  150. package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
  151. package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
  152. package/skills/create-campaign-v2/SKILL.md +1619 -0
  153. package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
  154. package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
  155. package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
  156. package/skills/create-campaign-v2/core/policy.md +82 -0
  157. package/skills/create-campaign-v2/references/ai-tells.md +253 -0
  158. package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
  159. package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
  160. package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
  161. package/skills/create-campaign-v2/references/filter-leads.md +495 -0
  162. package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
  163. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
  164. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
  165. package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
  166. package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
  167. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
  168. package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
  169. package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
  170. package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
  171. package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
  172. package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
  173. package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
  174. package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
  175. package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
  176. package/skills/create-campaign-v2-validation/SKILL.md +296 -0
  177. package/skills/create-post/SKILL.md +1308 -0
  178. package/skills/create-rubric/SKILL.md +251 -0
  179. package/skills/engage/SKILL.md +549 -0
  180. package/skills/engage/core/README.md +23 -0
  181. package/skills/engage/core/proven-searches.json +11 -0
  182. package/skills/engage/core/style-guide.template.md +47 -0
  183. package/skills/engage/core/tracked-people.json +10 -0
  184. package/skills/enrich-prospects/SKILL.md +97 -0
  185. package/skills/find-leads/SKILL.md +467 -0
  186. package/skills/generate-messages/SKILL.md +2361 -0
  187. package/skills/interview/SKILL.md +132 -0
  188. package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
  189. package/skills/interview/core/ICP.template.md +54 -0
  190. package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
  191. package/skills/providers/apollo.md +520 -0
  192. package/skills/providers/prospeo.md +398 -0
  193. package/skills/providers/sales-nav.md +372 -0
  194. package/skills/providers/signal-discovery.md +495 -0
  195. package/skills/research/SKILL.md +258 -0
  196. package/skills/research/config.json +9 -0
  197. package/skills/research/override.md +13 -0
  198. package/skills/research-prospect/SKILL.md +99 -0
  199. package/skills/research-sender/SKILL.md +158 -0
  200. package/skills/workflow-sequences/SKILL.md +85 -0
@@ -0,0 +1,1643 @@
1
+ {
2
+ "version": "v2",
3
+ "workflow": "create-campaign-v2",
4
+ "principle": "Start from a user interview, validate artifacts with interrupt-only gates, mint atomically after explicit commit, then run the autonomous tail.",
5
+ "commitGateChoices": [
6
+ "approve",
7
+ "revise-brief",
8
+ "revise-leads",
9
+ "revise-rubric",
10
+ "revise-messaging",
11
+ "abort"
12
+ ],
13
+ "events": [
14
+ "bootstrap_complete",
15
+ "brief_v1_ready",
16
+ "source_intake_ready",
17
+ "user_brief_confirmed",
18
+ "lead_review_ready",
19
+ "lead_review_confirmed",
20
+ "lead_filter_ready",
21
+ "message_prep_ready",
22
+ "message_candidate_drafts_ready",
23
+ "message_validation_ready",
24
+ "message_approved",
25
+ "approval_packet_ready",
26
+ "confirm_with_user",
27
+ "revise_brief",
28
+ "revise_leads",
29
+ "revise_rubric",
30
+ "revise_messaging",
31
+ "artifacts_validated",
32
+ "user_approved",
33
+ "user_revise_brief",
34
+ "user_revise_leads",
35
+ "user_revise_rubric",
36
+ "user_revise_messaging",
37
+ "user_abort",
38
+ "campaign_minted",
39
+ "rubrics_saved",
40
+ "watch_link_surfaced",
41
+ "autonomous_tail_started",
42
+ "leads_imported",
43
+ "sample_validated",
44
+ "sample_revision_required",
45
+ "review_batch_ready",
46
+ "awaiting_user_greenlight",
47
+ "user_greenlight",
48
+ "campaign_started",
49
+ "escalation_triggered"
50
+ ],
51
+ "steps": [
52
+ {
53
+ "id": "bootstrap",
54
+ "label": "Bootstrap",
55
+ "onEnter": [
56
+ {
57
+ "tool": "bootstrap_create_campaign",
58
+ "requiredValues": {
59
+ "flowVersion": "v2"
60
+ }
61
+ },
62
+ {
63
+ "tool": "get_subskill_prompt",
64
+ "requiredValues": {
65
+ "subskillName": "create-campaign-v2"
66
+ }
67
+ }
68
+ ],
69
+ "requiredArtifacts": [],
70
+ "producesArtifacts": [],
71
+ "allowedTools": [
72
+ "bootstrap_create_campaign",
73
+ "get_auth_status",
74
+ "get_active_workspace",
75
+ "get_subskill_prompt",
76
+ "AskUserQuestion"
77
+ ],
78
+ "doNotAllow": [
79
+ "create_campaign",
80
+ "save_rubrics",
81
+ "import_leads",
82
+ "confirm_lead_list",
83
+ "update_campaign",
84
+ "queue_cells",
85
+ "start_campaign"
86
+ ],
87
+ "watchRequired": false,
88
+ "waitFor": "bootstrap_complete",
89
+ "transitions": {
90
+ "bootstrap_complete": "brief-interview"
91
+ }
92
+ },
93
+ {
94
+ "id": "brief-interview",
95
+ "label": "Campaign brief interview",
96
+ "onEnter": [
97
+ {
98
+ "action": "resolve_company_identity_before_strategy_packet",
99
+ "optional": true,
100
+ "when": "user_supplied_company_domain_website_or_linkedin_profile",
101
+ "allowedTools": [
102
+ "fetch_company",
103
+ "fetch_linkedin_profile",
104
+ "WebFetch",
105
+ "WebSearch"
106
+ ],
107
+ "maxCalls": 1,
108
+ "mustNotInferFromNameOnly": true,
109
+ "fallback": "use neutral/custom intake options when identity is unavailable"
110
+ },
111
+ {
112
+ "action": "render_post_intake_progress_preamble",
113
+ "after": "founder_strategy_source_packet_answered",
114
+ "requiredVisibleContent": [
115
+ "turn this into a campaign brief",
116
+ "approve it or tell me what to change",
117
+ "before I source leads"
118
+ ],
119
+ "timeEstimates": {
120
+ "campaignBrief": "~1-2 min"
121
+ },
122
+ "forbiddenWording": [
123
+ "brief-v1.md",
124
+ "lead-review.md",
125
+ "lead-sample.json",
126
+ "message-validation.md"
127
+ ]
128
+ },
129
+ {
130
+ "action": "run_subskill",
131
+ "target": "create-campaign-brief"
132
+ },
133
+ {
134
+ "action": "write_artifact",
135
+ "artifact": "brief-v1.md"
136
+ },
137
+ {
138
+ "action": "copy_artifact",
139
+ "from": "brief-v1.md",
140
+ "to": "brief.md",
141
+ "reason": "brief.md remains the canonical downstream artifact name"
142
+ },
143
+ {
144
+ "action": "ask_source_intake_after_strategy_batch",
145
+ "artifact": "lead-source-intake.json",
146
+ "optional": true,
147
+ "question": "How should we get the people for this campaign?",
148
+ "options": [
149
+ "Find people for me (recommended if you don't already have your own list)",
150
+ "I have a CSV of LinkedIn profiles",
151
+ "I have a CSV of company domains"
152
+ ],
153
+ "customInput": true,
154
+ "lastQuestionInFirstStrategyBatch": true
155
+ }
156
+ ],
157
+ "requiredArtifacts": [],
158
+ "producesArtifacts": [
159
+ "brief-v1.md",
160
+ "brief.md"
161
+ ],
162
+ "allowedTools": [
163
+ "get_subskill_prompt",
164
+ "get_auth_status",
165
+ "get_active_workspace",
166
+ "enrich_sender",
167
+ "complete_sender_research",
168
+ "fetch_company",
169
+ "fetch_company_posts",
170
+ "fetch_linkedin_profile",
171
+ "fetch_linkedin_posts",
172
+ "WebFetch",
173
+ "WebSearch",
174
+ "AskUserQuestion"
175
+ ],
176
+ "doNotAllow": [
177
+ "create_campaign",
178
+ "save_rubrics",
179
+ "import_leads",
180
+ "confirm_lead_list",
181
+ "update_campaign",
182
+ "queue_cells",
183
+ "start_campaign"
184
+ ],
185
+ "watchRequired": false,
186
+ "waitFor": [
187
+ "brief_v1_ready",
188
+ "confirm_with_user"
189
+ ],
190
+ "transitions": {
191
+ "brief_v1_ready": "brief-review",
192
+ "confirm_with_user": "brief-review"
193
+ },
194
+ "optionalProducesArtifacts": [
195
+ "lead-source-intake.json"
196
+ ]
197
+ },
198
+ {
199
+ "id": "brief-review",
200
+ "label": "Brief review",
201
+ "onEnter": [
202
+ {
203
+ "action": "show_brief_summary",
204
+ "artifact": "brief-v1.md"
205
+ },
206
+ {
207
+ "action": "render_brief_approval_checkpoint",
208
+ "requiredVisibleContent": [
209
+ "approve this brief",
210
+ "revise the brief",
211
+ "then I will find good-fit leads"
212
+ ],
213
+ "avoidQuestionWhenOnlyUsefulAnswerIs": "looks good"
214
+ },
215
+ {
216
+ "action": "ask_continue_or_revise_only_if_needed",
217
+ "autoContinueWhen": {
218
+ "artifactStatus": "confirmed",
219
+ "confidenceIn": [
220
+ "high",
221
+ "medium"
222
+ ],
223
+ "noOpenStrategicTradeoff": true,
224
+ "noMissingRequiredInputs": true
225
+ }
226
+ }
227
+ ],
228
+ "requiredArtifacts": [
229
+ "brief-v1.md",
230
+ "brief.md"
231
+ ],
232
+ "producesArtifacts": [],
233
+ "allowedTools": [
234
+ "AskUserQuestion",
235
+ "get_subskill_prompt"
236
+ ],
237
+ "doNotAllow": [
238
+ "create_campaign",
239
+ "save_rubrics",
240
+ "import_leads",
241
+ "confirm_lead_list",
242
+ "update_campaign",
243
+ "queue_cells",
244
+ "start_campaign"
245
+ ],
246
+ "watchRequired": false,
247
+ "waitFor": [
248
+ "user_brief_confirmed",
249
+ "revise_brief",
250
+ "auto_continue"
251
+ ],
252
+ "transitions": {
253
+ "user_brief_confirmed": "find-leads",
254
+ "revise_brief": "brief-interview",
255
+ "auto_continue": "find-leads"
256
+ },
257
+ "interruptOnly": true
258
+ },
259
+ {
260
+ "id": "find-leads",
261
+ "label": "Find leads",
262
+ "onEnter": [
263
+ {
264
+ "action": "render_find_leads_progress",
265
+ "requiredVisibleContent": [
266
+ "good fit and likely to reply on LinkedIn",
267
+ "expected volume",
268
+ "likely connection acceptance rate",
269
+ "likely reply rate",
270
+ "signal quality",
271
+ "tradeoffs",
272
+ "source decision + sample",
273
+ "before anything goes live"
274
+ ],
275
+ "timeEstimate": "~3-5 min"
276
+ },
277
+ {
278
+ "action": "read_optional_source_intake",
279
+ "artifact": "lead-source-intake.json",
280
+ "sourceTypes": [
281
+ "normal-discovery",
282
+ "supplied-linkedin-profiles",
283
+ "supplied-domains",
284
+ "existing-lead-list"
285
+ ],
286
+ "pastedInput": "normalize up to 100 LinkedIn profile URLs or domains into a temporary local CSV before preview"
287
+ },
288
+ {
289
+ "action": "run_subskill",
290
+ "target": "find-leads",
291
+ "mode": "campaignless-preview"
292
+ },
293
+ {
294
+ "action": "write_artifacts",
295
+ "artifacts": [
296
+ "lead-review.md",
297
+ "lead-sample.json"
298
+ ]
299
+ }
300
+ ],
301
+ "requiredArtifacts": [
302
+ "brief-v1.md",
303
+ "brief.md"
304
+ ],
305
+ "producesArtifacts": [
306
+ "lead-review.md",
307
+ "lead-sample.json"
308
+ ],
309
+ "allowedTools": [
310
+ "get_subskill_prompt",
311
+ "get_provider_prompt",
312
+ "lookup_sales_nav_filter",
313
+ "search_sales_nav",
314
+ "search_prospeo",
315
+ "search_signals",
316
+ "fetch_post_engagers",
317
+ "fetch_company",
318
+ "fetch_linkedin_profile",
319
+ "AskUserQuestion",
320
+ "load_csv_linkedin_leads",
321
+ "load_csv_domains",
322
+ "get_rows_minimal"
323
+ ],
324
+ "doNotAllow": [
325
+ "create_campaign",
326
+ "save_rubrics",
327
+ "import_leads",
328
+ "confirm_lead_list",
329
+ "update_campaign",
330
+ "queue_cells",
331
+ "start_campaign"
332
+ ],
333
+ "watchRequired": false,
334
+ "waitFor": [
335
+ "lead_review_ready",
336
+ "revise_brief",
337
+ "confirm_with_user"
338
+ ],
339
+ "transitions": {
340
+ "lead_review_ready": "lead-review",
341
+ "revise_brief": "brief-interview",
342
+ "confirm_with_user": "lead-review"
343
+ },
344
+ "optionalRequiredArtifacts": [
345
+ "lead-source-intake.json"
346
+ ],
347
+ "toolRules": {
348
+ "suppliedLinkedinProfiles": "Preview only before approval: call load_csv_linkedin_leads without confirmed, campaignOfferId, currentStep, leadListId, sourceLeadListId, or provider-import parameters; skip provider discovery.",
349
+ "suppliedDomains": "May confirm load_csv_domains before approval only without campaignOfferId/currentStep to produce a standalone domainFilterId, then run a campaignless Prospeo sample constrained by domainFilterId.",
350
+ "existingLeadList": "Skip provider discovery and sample existing rows before approval; do not clone/import until after approval.",
351
+ "forbiddenPreApproval": [
352
+ "create_campaign",
353
+ "import_leads",
354
+ "confirm_lead_list",
355
+ "update_campaign",
356
+ "queue_cells",
357
+ "start_campaign",
358
+ "save_domain_filters"
359
+ ]
360
+ }
361
+ },
362
+ {
363
+ "id": "lead-review",
364
+ "label": "Lead review",
365
+ "onEnter": [
366
+ {
367
+ "action": "show_lead_review",
368
+ "artifact": "lead-review.md",
369
+ "renderInlineSections": [
370
+ "## Source Decision",
371
+ "## Selected Signal Posts",
372
+ "## Expected LinkedIn Funnel",
373
+ "## Sample Leads",
374
+ "## Pros",
375
+ "## Tradeoffs",
376
+ "## Discarded Paths"
377
+ ],
378
+ "signalsFirstRequiredFields": [
379
+ "post URL",
380
+ "post author",
381
+ "posted date or recency",
382
+ "topic or excerpt",
383
+ "engagement or estimated engagers",
384
+ "sampled engagers",
385
+ "sampled fits",
386
+ "estimated usable leads",
387
+ "why use or discard"
388
+ ],
389
+ "doNotCompressToSummaryOnly": true,
390
+ "doNotRenderArtifactLinksOnly": true
391
+ },
392
+ {
393
+ "action": "render_post_lead_parallel_progress",
394
+ "requiredVisibleContent": [
395
+ "Lead source is set",
396
+ "apply the fit filter",
397
+ "clean the list down to great fits",
398
+ "draft the first message we should test",
399
+ "run in parallel"
400
+ ],
401
+ "timeEstimate": "~2-3 min"
402
+ },
403
+ {
404
+ "action": "ask_continue_revise_or_confirm_only_if_needed",
405
+ "autoContinueWhen": {
406
+ "status": "confirmed",
407
+ "confidenceIn": [
408
+ "high",
409
+ "medium"
410
+ ],
411
+ "projectedGoodFitsAtLeast": 150,
412
+ "samplePassRateAtLeast": 0.7,
413
+ "noProviderMismatch": true,
414
+ "noStrategicTradeoff": true
415
+ }
416
+ }
417
+ ],
418
+ "requiredArtifacts": [
419
+ "lead-review.md",
420
+ "lead-sample.json"
421
+ ],
422
+ "producesArtifacts": [],
423
+ "allowedTools": [
424
+ "AskUserQuestion",
425
+ "get_subskill_prompt"
426
+ ],
427
+ "doNotAllow": [
428
+ "create_campaign",
429
+ "save_rubrics",
430
+ "import_leads",
431
+ "confirm_lead_list",
432
+ "update_campaign",
433
+ "queue_cells",
434
+ "start_campaign"
435
+ ],
436
+ "watchRequired": false,
437
+ "waitFor": [
438
+ "lead_review_confirmed",
439
+ "revise_leads",
440
+ "confirm_with_user",
441
+ "auto_continue"
442
+ ],
443
+ "transitions": {
444
+ "lead_review_confirmed": "filter-rubric",
445
+ "revise_leads": "find-leads",
446
+ "confirm_with_user": "filter-rubric",
447
+ "auto_continue": "filter-rubric"
448
+ },
449
+ "interruptOnly": true
450
+ },
451
+ {
452
+ "id": "filter-rubric",
453
+ "label": "Lead filters and production rubrics",
454
+ "onEnter": [
455
+ {
456
+ "action": "run_stage",
457
+ "target": "filter-leads",
458
+ "inputs": [
459
+ "brief.md",
460
+ "lead-review.md",
461
+ "lead-sample.json"
462
+ ]
463
+ },
464
+ {
465
+ "action": "write_artifacts",
466
+ "artifacts": [
467
+ "lead-filter.md"
468
+ ],
469
+ "optionalArtifacts": [
470
+ "rubric.json"
471
+ ]
472
+ },
473
+ {
474
+ "action": "ask_revise_only_if_filter_is_not_confirmed",
475
+ "autoContinueWhen": {
476
+ "status": "confirmed",
477
+ "decisionIn": [
478
+ "continue",
479
+ "confirmed"
480
+ ],
481
+ "expectedUsableLeadsAtLeast": 150,
482
+ "noHeavyFilteringWarning": true,
483
+ "noCampaignMissRisk": true
484
+ }
485
+ }
486
+ ],
487
+ "requiredArtifacts": [
488
+ "brief.md",
489
+ "lead-review.md",
490
+ "lead-sample.json"
491
+ ],
492
+ "producesArtifacts": [
493
+ "lead-filter.md"
494
+ ],
495
+ "optionalProducesArtifacts": [
496
+ "rubric.json"
497
+ ],
498
+ "allowedTools": [
499
+ "get_subskill_prompt",
500
+ "AskUserQuestion"
501
+ ],
502
+ "doNotAllow": [
503
+ "create_campaign",
504
+ "save_rubrics",
505
+ "import_leads",
506
+ "confirm_lead_list",
507
+ "update_campaign",
508
+ "queue_cells",
509
+ "start_campaign",
510
+ "check_rubric"
511
+ ],
512
+ "watchRequired": false,
513
+ "waitFor": [
514
+ "lead_filter_ready",
515
+ "revise_leads",
516
+ "confirm_with_user",
517
+ "auto_continue"
518
+ ],
519
+ "transitions": {
520
+ "lead_filter_ready": "message-generation",
521
+ "revise_leads": "find-leads",
522
+ "confirm_with_user": "message-generation",
523
+ "auto_continue": "message-generation"
524
+ },
525
+ "interruptOnly": true
526
+ },
527
+ {
528
+ "id": "message-generation",
529
+ "label": "Message generation",
530
+ "onEnter": [
531
+ {
532
+ "action": "run_or_reconcile_subskill",
533
+ "target": "generate-messages",
534
+ "mode": "DRY MODE",
535
+ "toolCallRequiredBeforeArtifacts": [
536
+ "get_subskill_prompt({ subskillName: \"generate-messages\", offset, limit }) until hasMore=false"
537
+ ],
538
+ "skipIfFreshArtifactExists": "message-validation.md",
539
+ "reconcileWith": "lead-filter.md"
540
+ },
541
+ {
542
+ "action": "write_artifact",
543
+ "artifact": "message-validation.md"
544
+ }
545
+ ],
546
+ "requiredArtifacts": [
547
+ "brief.md",
548
+ "lead-review.md",
549
+ "lead-sample.json"
550
+ ],
551
+ "producesArtifacts": [
552
+ "message-validation.md"
553
+ ],
554
+ "allowedTools": [
555
+ "get_subskill_prompt",
556
+ "AskUserQuestion"
557
+ ],
558
+ "toolRules": [
559
+ "Before writing message-validation.md, message-review.md, approval-packet.md, or a commit-gate AskUserQuestion, the current run must read 100% of the real generate-messages prompt via chunked get_subskill_prompt({ subskillName: \"generate-messages\", offset, limit }) calls.",
560
+ "Do not hand-write message-validation.md from message-prep.md, message-candidate-drafts.md, or general campaign knowledge.",
561
+ "message-validation.md must prove the full generate-messages workflow ran: Gold Standard Strategy Map, Proof Inventory, Token Fill Rules, Token Adherence Table, Angle Drafts, Kill / Combine Review, Finalists, Finalizer Pass, Gold-Standard Quality Gate, Skeptical Prospect Review, Winner Gate, and a raw sendable Selected Winner are required before message-review can recommend approve-message.",
562
+ "If the Codex-hosted output is plausible but weaker than the loaded gold-standard examples, stop at message-review with revise-messaging. Do not continue to approval or mint just because the mechanical flow worked.",
563
+ "If the message review or approval packet is ready but the generate-messages prompt was not retrieved in this run, route back to message-generation instead of asking the commit gate."
564
+ ],
565
+ "doNotAllow": [
566
+ "create_campaign",
567
+ "save_rubrics",
568
+ "import_leads",
569
+ "confirm_lead_list",
570
+ "update_campaign",
571
+ "queue_cells",
572
+ "start_campaign",
573
+ "generate_messages"
574
+ ],
575
+ "watchRequired": false,
576
+ "waitFor": [
577
+ "message_validation_ready",
578
+ "revise_rubric",
579
+ "revise_messaging",
580
+ "confirm_with_user",
581
+ "auto_continue"
582
+ ],
583
+ "transitions": {
584
+ "message_validation_ready": "message-review",
585
+ "revise_rubric": "filter-rubric",
586
+ "revise_messaging": "message-generation",
587
+ "confirm_with_user": "message-review",
588
+ "auto_continue": "message-review"
589
+ },
590
+ "optionalRequiredArtifacts": [
591
+ "message-prep.md",
592
+ "message-candidate-drafts.md"
593
+ ],
594
+ "interruptOnly": true
595
+ },
596
+ {
597
+ "id": "message-review",
598
+ "label": "Message review gate",
599
+ "normalFlow": true,
600
+ "resumeOnly": false,
601
+ "onEnter": [
602
+ {
603
+ "action": "read_draft_artifacts",
604
+ "requiredFiles": [
605
+ "brief.md",
606
+ "lead-review.md",
607
+ "lead-sample.json",
608
+ "lead-filter.md",
609
+ "message-validation.md"
610
+ ],
611
+ "optionalFiles": [
612
+ "message-prep.md",
613
+ "message-candidate-drafts.md"
614
+ ]
615
+ },
616
+ {
617
+ "action": "write_message_review",
618
+ "artifact": "message-review.md",
619
+ "requiredInlineMarker": "Status: message-review",
620
+ "panels": [
621
+ "subject",
622
+ "message",
623
+ "rendered examples",
624
+ "token notes",
625
+ "my take",
626
+ "suggested adjustment",
627
+ "question",
628
+ "recommendation"
629
+ ],
630
+ "requiredLabels": [
631
+ "Subject:",
632
+ "Message:",
633
+ "Rendered examples:",
634
+ "Good token fill:",
635
+ "Good omit:",
636
+ "Token notes:",
637
+ "My take:",
638
+ "Suggested adjustment:",
639
+ "Question: approve-message or revise-messaging?",
640
+ "Recommendation:"
641
+ ],
642
+ "allowedRecommendations": [
643
+ "approve-message",
644
+ "revise-messaging"
645
+ ],
646
+ "judgeAgainst": [
647
+ "generate-messages rules",
648
+ "gold-standard-* references",
649
+ "opener strategy diversity",
650
+ "raw sendable copy",
651
+ "concrete enriched-row tokens",
652
+ "no generic signal tokens",
653
+ "no bracketed or deferred row instructions",
654
+ "tokenized template with rendered examples",
655
+ "complete rendered subject plus body examples",
656
+ "message-review hard-fail preflight",
657
+ "A + B + C subject quality",
658
+ "no generic subject lines",
659
+ "product job before category nouns",
660
+ "proof clarity",
661
+ "CTA usefulness",
662
+ "length and tightness",
663
+ "campaign thesis fit"
664
+ ],
665
+ "userFacing": true
666
+ },
667
+ {
668
+ "action": "ask_message_review_choice",
669
+ "choices": [
670
+ "approve-message",
671
+ "revise-messaging"
672
+ ],
673
+ "stopAfterQuestion": true
674
+ },
675
+ {
676
+ "action": "write_message_review_decision",
677
+ "artifact": "message-review-decision.md",
678
+ "allowedChoices": [
679
+ "approve-message",
680
+ "revise-messaging"
681
+ ],
682
+ "doesNotAuthorizeMint": true
683
+ },
684
+ {
685
+ "action": "require_message_review_decision",
686
+ "artifact": "message-review-decision.md",
687
+ "requiredValue": "approve-message"
688
+ }
689
+ ],
690
+ "requiredArtifacts": [
691
+ "brief.md",
692
+ "lead-review.md",
693
+ "lead-sample.json",
694
+ "lead-filter.md",
695
+ "message-validation.md"
696
+ ],
697
+ "producesArtifacts": [
698
+ "message-review.md",
699
+ "message-review-decision.md"
700
+ ],
701
+ "allowedTools": [
702
+ "AskUserQuestion",
703
+ "get_subskill_prompt"
704
+ ],
705
+ "doNotAllow": [
706
+ "create_campaign",
707
+ "save_rubrics",
708
+ "import_leads",
709
+ "confirm_lead_list",
710
+ "update_campaign",
711
+ "queue_cells",
712
+ "start_campaign"
713
+ ],
714
+ "watchRequired": false,
715
+ "waitFor": [
716
+ "message_approved",
717
+ "revise_messaging"
718
+ ],
719
+ "transitions": {
720
+ "message_approved": "approval-packet",
721
+ "revise_messaging": "message-generation"
722
+ },
723
+ "interruptOnly": true
724
+ },
725
+ {
726
+ "id": "approval-packet",
727
+ "label": "Approval packet",
728
+ "normalFlow": true,
729
+ "resumeOnly": false,
730
+ "onEnter": [
731
+ {
732
+ "action": "read_draft_artifacts",
733
+ "requiredFiles": [
734
+ "brief.md",
735
+ "lead-review.md",
736
+ "lead-sample.json",
737
+ "lead-filter.md",
738
+ "message-validation.md",
739
+ "message-review.md",
740
+ "message-review-decision.md"
741
+ ],
742
+ "optionalFiles": [
743
+ "rubric.json"
744
+ ]
745
+ },
746
+ {
747
+ "action": "require_message_review_decision",
748
+ "artifact": "message-review-decision.md",
749
+ "requiredValue": "approve-message",
750
+ "doesNotAuthorizeMint": true
751
+ },
752
+ {
753
+ "action": "write_approval_packet",
754
+ "artifact": "approval-packet.md",
755
+ "requiredInlineMarker": "Status: approval-packet",
756
+ "mustRenderInlineBeforeCommitGate": true,
757
+ "panels": [
758
+ "campaign direction",
759
+ "lead source and sample",
760
+ "filters and rubrics",
761
+ "message review",
762
+ "messages",
763
+ "risks and next action"
764
+ ],
765
+ "userFacing": true,
766
+ "doNotUseWords": [
767
+ "anchor",
768
+ "validation anchor",
769
+ "lane"
770
+ ]
771
+ },
772
+ {
773
+ "action": "optional_customer_roleplay",
774
+ "artifact": "customer-roleplay.md",
775
+ "advisoryOnly": true,
776
+ "cannotAuthorizeMint": true
777
+ }
778
+ ],
779
+ "requiredArtifacts": [
780
+ "brief.md",
781
+ "lead-review.md",
782
+ "lead-sample.json",
783
+ "lead-filter.md",
784
+ "message-validation.md",
785
+ "message-review.md",
786
+ "message-review-decision.md"
787
+ ],
788
+ "producesArtifacts": [
789
+ "approval-packet.md"
790
+ ],
791
+ "optionalProducesArtifacts": [
792
+ "customer-roleplay.md"
793
+ ],
794
+ "allowedTools": [
795
+ "AskUserQuestion",
796
+ "get_subskill_prompt"
797
+ ],
798
+ "doNotAllow": [
799
+ "create_campaign",
800
+ "save_rubrics",
801
+ "import_leads",
802
+ "confirm_lead_list",
803
+ "update_campaign",
804
+ "queue_cells",
805
+ "start_campaign"
806
+ ],
807
+ "watchRequired": false,
808
+ "waitFor": "approval_packet_ready",
809
+ "transitions": {
810
+ "approval_packet_ready": "commit-gate"
811
+ },
812
+ "optionalRequiredArtifacts": [
813
+ "lead-source-intake.json"
814
+ ]
815
+ },
816
+ {
817
+ "id": "validate-artifacts",
818
+ "label": "Validate chained artifacts",
819
+ "onEnter": [
820
+ {
821
+ "action": "read_draft_artifacts",
822
+ "requiredFiles": [
823
+ "brief.md",
824
+ "lead-review.md",
825
+ "lead-sample.json",
826
+ "lead-filter.md",
827
+ "message-validation.md"
828
+ ],
829
+ "optionalFiles": [
830
+ "rubric.json"
831
+ ]
832
+ },
833
+ {
834
+ "action": "validate_anchors",
835
+ "blockOnEmpty": true
836
+ },
837
+ {
838
+ "action": "require_message_review_decision",
839
+ "artifact": "message-review-decision.md",
840
+ "requiredValue": "approve-message",
841
+ "doesNotAuthorizeMint": true
842
+ }
843
+ ],
844
+ "allowedTools": [
845
+ "AskUserQuestion"
846
+ ],
847
+ "watchRequired": false,
848
+ "waitFor": "artifacts_validated",
849
+ "transitions": {
850
+ "artifacts_validated": "approval-packet"
851
+ },
852
+ "optionalRequiredArtifacts": [
853
+ "lead-source-intake.json"
854
+ ]
855
+ },
856
+ {
857
+ "id": "commit-gate",
858
+ "label": "Commit gate",
859
+ "onEnter": [
860
+ {
861
+ "action": "require_message_review_decision",
862
+ "artifact": "message-review-decision.md",
863
+ "requiredValue": "approve-message",
864
+ "doesNotAuthorizeMint": true
865
+ },
866
+ {
867
+ "action": "show_approval_packet",
868
+ "requiredInlineMarker": "Status: approval-packet",
869
+ "sameTurnAsCommitQuestion": true,
870
+ "panels": [
871
+ "brief",
872
+ "lead sample",
873
+ "lead filter",
874
+ "message validation"
875
+ ]
876
+ },
877
+ {
878
+ "action": "ask_commit_choice",
879
+ "choices": [
880
+ "approve",
881
+ "revise-brief",
882
+ "revise-leads",
883
+ "revise-rubric",
884
+ "revise-messaging",
885
+ "abort"
886
+ ]
887
+ },
888
+ {
889
+ "action": "write_commit_gate_decision",
890
+ "artifact": "commit-gate-decision.md",
891
+ "allowedChoices": [
892
+ "approve",
893
+ "revise-brief",
894
+ "revise-leads",
895
+ "revise-rubric",
896
+ "revise-messaging",
897
+ "abort"
898
+ ],
899
+ "onlyApproveAuthorizesMint": true
900
+ }
901
+ ],
902
+ "allowedTools": [
903
+ "AskUserQuestion"
904
+ ],
905
+ "watchRequired": false,
906
+ "waitFor": [
907
+ "user_approved",
908
+ "user_revise_brief",
909
+ "user_revise_leads",
910
+ "user_revise_rubric",
911
+ "user_revise_messaging",
912
+ "user_abort"
913
+ ],
914
+ "transitions": {
915
+ "user_approved": "atomic-mint",
916
+ "user_revise_brief": "revise-brief",
917
+ "user_revise_leads": "revise-leads",
918
+ "user_revise_rubric": "revise-rubric",
919
+ "user_revise_messaging": "revise-messaging",
920
+ "user_abort": "abort"
921
+ },
922
+ "optionalRequiredArtifacts": [
923
+ "lead-source-intake.json"
924
+ ]
925
+ },
926
+ {
927
+ "id": "atomic-mint",
928
+ "label": "Atomic mint",
929
+ "currentStepValue": "auto-execute-leads",
930
+ "onEnter": [
931
+ {
932
+ "tool": "bootstrap_create_campaign",
933
+ "requiredValues": {
934
+ "flowVersion": "v2"
935
+ }
936
+ },
937
+ {
938
+ "tool": "create_campaign",
939
+ "requiredFields": [
940
+ "campaignBrief",
941
+ "currentStep"
942
+ ],
943
+ "requiredValues": {
944
+ "currentStep": "auto-execute-leads"
945
+ },
946
+ "capture": [
947
+ "campaignId",
948
+ "watchUrl"
949
+ ],
950
+ "onMissingWatchUrl": "recoverable_failure_abort_before_rubric_save"
951
+ },
952
+ {
953
+ "tool": "save_rubrics",
954
+ "requiredFields": [
955
+ "rubric"
956
+ ],
957
+ "onFailure": "rollback_or_recoverable_stop"
958
+ },
959
+ {
960
+ "action": "flip_brief_status_to_committed"
961
+ },
962
+ {
963
+ "action": "move_draft_dir_to_committed"
964
+ },
965
+ {
966
+ "action": "surface_watch_link",
967
+ "requires": [
968
+ "create_campaign_succeeded",
969
+ "save_rubrics_succeeded"
970
+ ]
971
+ }
972
+ ],
973
+ "allowedTools": [
974
+ "bootstrap_create_campaign",
975
+ "create_campaign",
976
+ "save_rubrics",
977
+ "AskUserQuestion"
978
+ ],
979
+ "doNotAllow": [
980
+ "import_leads"
981
+ ],
982
+ "watchRequired": true,
983
+ "waitFor": "autonomous_tail_started",
984
+ "transitions": {
985
+ "autonomous_tail_started": "autonomous-tail-handoff"
986
+ }
987
+ },
988
+ {
989
+ "id": "autonomous-tail-handoff",
990
+ "label": "Handoff to autonomous tail (Plan 85-02)",
991
+ "onEnter": [
992
+ {
993
+ "action": "resume_watch_link"
994
+ },
995
+ {
996
+ "action": "load_auto_execute_config",
997
+ "source": "core/auto-execute.yaml",
998
+ "loadOnce": true
999
+ },
1000
+ {
1001
+ "action": "handoff_to_plan",
1002
+ "target": "85-02"
1003
+ }
1004
+ ],
1005
+ "allowedTools": [
1006
+ "AskUserQuestion"
1007
+ ],
1008
+ "transitions": {
1009
+ "autonomous_tail_started": "auto-execute-leads"
1010
+ }
1011
+ },
1012
+ {
1013
+ "id": "auto-execute-leads",
1014
+ "label": "Step 13: Import review batch",
1015
+ "currentStepValue": "auto-execute-leads",
1016
+ "reference": "references/step-13-import-leads.md",
1017
+ "onEnter": [
1018
+ {
1019
+ "action": "resolve_approved_source",
1020
+ "manifest": "lead-source-intake.json",
1021
+ "defaultWhenMissing": "discovered-provider-import",
1022
+ "branches": {
1023
+ "normal-discovery": "import_leads({ campaignOfferId, targetLeadCount: import.importLimit })",
1024
+ "supplied-linkedin-profiles": "confirm load_csv_linkedin_leads after approval, then confirm_lead_list({ sourceLeadListId, targetLeadCount: import.importLimit })",
1025
+ "existing-lead-list": "confirm_lead_list({ sourceLeadListId: existingLeadListId, targetLeadCount: import.importLimit })",
1026
+ "supplied-domains": "reuse or confirm load_csv_domains, run campaign-associated search_prospeo({ campaignOfferId, domainFilterId }), then import_leads({ campaignOfferId, targetLeadCount: import.importLimit })"
1027
+ },
1028
+ "persistMaterializedIds": [
1029
+ "leadListId",
1030
+ "domainFilterId",
1031
+ "searchId",
1032
+ "campaignTableId",
1033
+ "importedRowIds",
1034
+ "queuedCellIds"
1035
+ ],
1036
+ "onSourceFileChanged": "escalate_before_materialization",
1037
+ "onLowDomainYield": "confirm-with-user: widen role filters, add more domains, or abort; never drop domainFilterId silently"
1038
+ },
1039
+ {
1040
+ "action": "watch_mode_orient"
1041
+ },
1042
+ {
1043
+ "tool": "import_leads",
1044
+ "requiredFields": [
1045
+ "campaignOfferId",
1046
+ "targetLeadCount"
1047
+ ],
1048
+ "targetLeadCountFromConfig": "import.importLimit",
1049
+ "onZeroLeads": "escalate_hard_fail",
1050
+ "modeAddHandshake": {
1051
+ "firstCallReturns": "needsModeSelection=true + existingLeadListId",
1052
+ "secondCallPasses": "sourceLeadListId=<existingLeadListId>",
1053
+ "note": "import_leads with mode=add is a two-step handshake; see references/step-13-import-leads.md"
1054
+ },
1055
+ "surfaceDedupRatio": true,
1056
+ "defaultBranch": "normal-discovery",
1057
+ "skipWhen": "resolved source branch returns sourceLeadListId for confirm_lead_list"
1058
+ },
1059
+ {
1060
+ "tool": "wait_for_lead_list_ready",
1061
+ "sourceBranches": [
1062
+ "normal-discovery",
1063
+ "supplied-domains"
1064
+ ],
1065
+ "skipWhen": "resolved source branch is supplied-linkedin-profiles or existing-lead-list; direct lead-list branches have no provider import job to wait on and this probe can poison the campaign import status"
1066
+ },
1067
+ {
1068
+ "tool": "confirm_lead_list",
1069
+ "targetLeadCountFromConfig": "import.importLimit",
1070
+ "sourceBranches": [
1071
+ "supplied-linkedin-profiles",
1072
+ "existing-lead-list"
1073
+ ]
1074
+ },
1075
+ {
1076
+ "tool": "get_rows_minimal",
1077
+ "purpose": "capture_enrich_cell_ids",
1078
+ "stripCarryData": true
1079
+ },
1080
+ {
1081
+ "tool": "queue_cells",
1082
+ "cellSource": "review_batch_enrich_prospect_cells_only",
1083
+ "batchSize": 100,
1084
+ "note": "one call starts the workflow-table cascade for the imported review batch only: DNC Check -> ICP Score -> Passes Rubric -> Generate Message. Do not queue cells outside the review batch before user expansion approval."
1085
+ },
1086
+ {
1087
+ "tool": "wait_for_campaign_table_ready",
1088
+ "purpose": "wait_for_cascade_to_drain"
1089
+ },
1090
+ {
1091
+ "tool": "update_campaign",
1092
+ "requiredFields": [
1093
+ "campaignId",
1094
+ "currentStep"
1095
+ ],
1096
+ "requiredValues": {
1097
+ "currentStep": "validate-sample"
1098
+ }
1099
+ }
1100
+ ],
1101
+ "allowedTools": [
1102
+ "import_leads",
1103
+ "wait_for_lead_list_ready",
1104
+ "confirm_lead_list",
1105
+ "get_rows_minimal",
1106
+ "queue_cells",
1107
+ "wait_for_campaign_table_ready",
1108
+ "update_campaign",
1109
+ "AskUserQuestion",
1110
+ "load_csv_linkedin_leads",
1111
+ "load_csv_domains",
1112
+ "get_provider_prompt",
1113
+ "search_prospeo"
1114
+ ],
1115
+ "doNotAllow": [
1116
+ "start_campaign"
1117
+ ],
1118
+ "watchRequired": true,
1119
+ "waitFor": "leads_imported",
1120
+ "transitions": {
1121
+ "leads_imported": "validate-sample",
1122
+ "escalation_triggered": "escalation"
1123
+ }
1124
+ },
1125
+ {
1126
+ "id": "validate-sample",
1127
+ "label": "Step 14: Sample validation loop",
1128
+ "currentStepValue": "validate-sample",
1129
+ "reference": "references/sample-validation-loop.md",
1130
+ "counter": {
1131
+ "name": "revisionRound",
1132
+ "initialValue": 0,
1133
+ "persistAcrossResume": true,
1134
+ "resetOnResume": false,
1135
+ "capFromConfig": "sample.maxRevisionRounds"
1136
+ },
1137
+ "onEnter": [
1138
+ {
1139
+ "action": "watch_mode_orient"
1140
+ },
1141
+ {
1142
+ "tool": "get_rows_minimal",
1143
+ "purpose": "read_passes_rubric_and_generate_message_status",
1144
+ "stripCarryData": true,
1145
+ "sampleSizeFromConfig": "sample.sampleSize"
1146
+ },
1147
+ {
1148
+ "tool": "wait_for_rubric_results",
1149
+ "requiredFields": [
1150
+ "targetCount"
1151
+ ],
1152
+ "targetCountSource": "stats.totalRows_or_imported_batch_count",
1153
+ "note": "default targetCount=25 returns ready=true after first 25 completions even when cohort is still pending; always pass cohortSize explicitly (see references/sample-validation-loop.md §Known Tool Behaviors #3)",
1154
+ "readVia": "subagent",
1155
+ "extractFields": [
1156
+ "ready",
1157
+ "passRate.completed",
1158
+ "stats"
1159
+ ],
1160
+ "doNotRetain": "rows_payload",
1161
+ "contextBloatNote": "25 rows ≈ 67KB; 100 rows ≈ 268KB; use subagent extraction (see references/sample-validation-loop.md §Known Tool Behaviors #2)"
1162
+ },
1163
+ {
1164
+ "action": "compute_projected_pass",
1165
+ "formula": "round(passInSample / sampleSize * importLimit)",
1166
+ "floorFromConfig": "sample.minProjectedPass"
1167
+ },
1168
+ {
1169
+ "action": "diagnose_brief_vs_list",
1170
+ "onBrief": "update_campaign_brief_and_rerun",
1171
+ "onList": "escalate",
1172
+ "onUnknown": "escalate"
1173
+ },
1174
+ {
1175
+ "action": "increment_revision_round",
1176
+ "capTripEvent": "escalation_triggered"
1177
+ }
1178
+ ],
1179
+ "allowedTools": [
1180
+ "get_rows_minimal",
1181
+ "wait_for_campaign_table_ready",
1182
+ "wait_for_rubric_results",
1183
+ "update_campaign_brief",
1184
+ "update_campaign",
1185
+ "AskUserQuestion"
1186
+ ],
1187
+ "doNotAllow": [
1188
+ "import_leads",
1189
+ "start_campaign",
1190
+ "enrich_with_prospeo",
1191
+ "bulk_enrich_with_prospeo",
1192
+ "check_rubric"
1193
+ ],
1194
+ "hardRules": [
1195
+ "list_problem_never_triggers_autonomous_update_campaign_brief",
1196
+ "revision_round_persists_across_resume",
1197
+ "wait_for_rubric_results_never_retain_rows_payload_in_tail_context",
1198
+ "wait_for_rubric_results_targetCount_always_explicit"
1199
+ ],
1200
+ "watchRequired": true,
1201
+ "waitFor": [
1202
+ "sample_validated",
1203
+ "sample_revision_required"
1204
+ ],
1205
+ "transitions": {
1206
+ "sample_validated": "auto-execute-messaging",
1207
+ "escalation_triggered": "escalation"
1208
+ }
1209
+ },
1210
+ {
1211
+ "id": "auto-execute-messaging",
1212
+ "label": "Step 15: Generate messages (sample then scale)",
1213
+ "currentStepValue": "auto-execute-messaging",
1214
+ "references": [
1215
+ "references/parallel-critique-protocol.md",
1216
+ "references/thomas-variant-selection.md",
1217
+ "references/thomas-revision-filters.md"
1218
+ ],
1219
+ "onEnter": [
1220
+ {
1221
+ "action": "watch_mode_orient"
1222
+ },
1223
+ {
1224
+ "action": "optional_critique_pass",
1225
+ "enabledFromConfig": "messaging.critique.enabled",
1226
+ "plan": "85-03",
1227
+ "protocol": "references/parallel-critique-protocol.md",
1228
+ "sampleSizeFromConfig": "messaging.critique.sampleSize",
1229
+ "budgetUsdCapFromConfig": "messaging.critique.budgetUsdCap",
1230
+ "perCriticTimeoutFromConfig": "messaging.critique.perCriticTimeoutSeconds",
1231
+ "totalTimeoutFromConfig": "messaging.critique.totalTimeoutSeconds",
1232
+ "criticsFromConfig": "messaging.critique.critics",
1233
+ "synthesisModelFromConfig": "messaging.critique.synthesis.model",
1234
+ "enforceFinalizerPassFromConfig": "messaging.critique.synthesis.enforceFinalizerPass",
1235
+ "rejectOnFakeProofFromConfig": "messaging.critique.rejectOnFakeProof",
1236
+ "rejectOnUnsupportedTokenFromConfig": "messaging.critique.rejectOnUnsupportedToken",
1237
+ "onBudgetTrip": "halt_critique_continue_plain_tail",
1238
+ "onPerCriticTimeout": "drop_critic_proceed_with_remaining",
1239
+ "onTotalTimeout": "persist_plain_message_for_row",
1240
+ "onTokenContractViolation": "persist_plain_message_for_row",
1241
+ "onFakeProof": "persist_plain_message_for_row"
1242
+ },
1243
+ {
1244
+ "action": "optional_opus_subset",
1245
+ "enabledFromConfig": "messaging.critique.opus.enabled",
1246
+ "selection": "references/thomas-variant-selection.md",
1247
+ "maxMessagesPerPassFromConfig": "messaging.critique.opus.maxMessagesPerPass",
1248
+ "budgetUsdCapFromConfig": "messaging.critique.opus.budgetUsdCap",
1249
+ "onOpusBudgetTrip": "halt_opus_continue_non_opus",
1250
+ "onOpusTokenContractViolation": "fallback_to_non_opus_rewrite"
1251
+ },
1252
+ {
1253
+ "action": "enforce_token_contract",
1254
+ "modeFromConfig": "messaging.tokenContract"
1255
+ },
1256
+ {
1257
+ "action": "verify_campaign_brief_template_mode",
1258
+ "requiredSection": "Approved Message Template",
1259
+ "requiredPattern": "{{...}}",
1260
+ "onFailure": "runtime_failure_before_messaging",
1261
+ "repairBoundary": "pre_mint_only",
1262
+ "purpose": "ensure Generate Message uses the approved template instead of full-generation mode"
1263
+ },
1264
+ {
1265
+ "tool": "get_rows_minimal",
1266
+ "purpose": "confirm_passing_rows_have_completed_generate_message_cells"
1267
+ },
1268
+ {
1269
+ "tool": "queue_cells",
1270
+ "cellSource": "pending_generate_message_cells_for_passing_rows",
1271
+ "when": "any passing row has pending or empty Generate Message cell",
1272
+ "batchSize": 100
1273
+ },
1274
+ {
1275
+ "tool": "wait_for_campaign_table_ready",
1276
+ "purpose": "wait_for_generate_message_cells_to_complete"
1277
+ },
1278
+ {
1279
+ "action": "observe_generate_message_results",
1280
+ "reference": "references/step-15-re-cascade.md",
1281
+ "trigger": "rows_flipped_pending_to_passed_after_first_generate_messages",
1282
+ "note": "Generate Message is produced by the workflow-table cascade. Do not call direct generate_messages in the autonomous tail."
1283
+ },
1284
+ {
1285
+ "tool": "update_campaign",
1286
+ "requiredFields": [
1287
+ "campaignId",
1288
+ "currentStep"
1289
+ ],
1290
+ "requiredValues": {
1291
+ "currentStep": "awaiting-user-greenlight"
1292
+ }
1293
+ }
1294
+ ],
1295
+ "allowedTools": [
1296
+ "get_rows_minimal",
1297
+ "queue_cells",
1298
+ "wait_for_campaign_table_ready",
1299
+ "update_campaign_brief",
1300
+ "update_campaign",
1301
+ "AskUserQuestion"
1302
+ ],
1303
+ "doNotAllow": [
1304
+ "import_leads",
1305
+ "start_campaign",
1306
+ "generate_messages"
1307
+ ],
1308
+ "hardRules": [
1309
+ "critique_failure_never_escalates",
1310
+ "critique_sample_size_bounded_by_config",
1311
+ "critics_fixed_at_targeting_copy_voice",
1312
+ "synthesis_enforces_phase_84_token_contract",
1313
+ "opus_reserved_for_highest_value_subset",
1314
+ "proposed_token_never_persisted_in_rewrite",
1315
+ "generate_messages_must_re_cascade_on_newly_passed_rows",
1316
+ "campaign_brief_must_contain_approved_message_template_tokens_before_generate_message_cascade"
1317
+ ],
1318
+ "watchRequired": true,
1319
+ "waitFor": [
1320
+ "review_batch_ready",
1321
+ "sample_revision_required"
1322
+ ],
1323
+ "transitions": {
1324
+ "review_batch_ready": "awaiting-user-greenlight",
1325
+ "escalation_triggered": "escalation"
1326
+ }
1327
+ },
1328
+ {
1329
+ "id": "awaiting-user-greenlight",
1330
+ "label": "Step 16: Awaiting user greenlight",
1331
+ "currentStepValue": "awaiting-user-greenlight",
1332
+ "reference": "references/final-handoff-contract.md",
1333
+ "onEnter": [
1334
+ {
1335
+ "tool": "attach_recommended_sequence"
1336
+ },
1337
+ {
1338
+ "action": "surface_watch_link",
1339
+ "requires": [
1340
+ "create_campaign_succeeded",
1341
+ "save_rubrics_succeeded"
1342
+ ]
1343
+ },
1344
+ {
1345
+ "action": "surface_source_materialization_summary",
1346
+ "manifest": "lead-source-intake.json",
1347
+ "requiredFields": [
1348
+ "sourceType",
1349
+ "sourceRowCount",
1350
+ "reviewBatchImportedCount"
1351
+ ],
1352
+ "note": "Say only the first review batch was enriched/messaged before greenlight."
1353
+ },
1354
+ {
1355
+ "action": "surface_orientation",
1356
+ "fromConfig": "handoff.orientation"
1357
+ },
1358
+ {
1359
+ "action": "stop_and_wait_for_greenlight"
1360
+ }
1361
+ ],
1362
+ "allowedTools": [
1363
+ "attach_recommended_sequence",
1364
+ "AskUserQuestion"
1365
+ ],
1366
+ "doNotAllow": [
1367
+ "start_campaign",
1368
+ "import_leads"
1369
+ ],
1370
+ "autoStart": false,
1371
+ "watchRequired": true,
1372
+ "waitFor": [
1373
+ "user_greenlight",
1374
+ "ui_start_detected"
1375
+ ],
1376
+ "transitions": {
1377
+ "user_greenlight": "claude-greenlight",
1378
+ "ui_start_detected": "running"
1379
+ },
1380
+ "optionalRequiredArtifacts": [
1381
+ "lead-source-intake.json"
1382
+ ]
1383
+ },
1384
+ {
1385
+ "id": "claude-greenlight",
1386
+ "label": "Claude greenlight path",
1387
+ "reference": "references/final-handoff-contract.md",
1388
+ "onEnter": [
1389
+ {
1390
+ "tool": "get_campaign",
1391
+ "purpose": "detect_already_running"
1392
+ },
1393
+ {
1394
+ "action": "short_circuit_if_already_running",
1395
+ "onAlreadyRunning": "running"
1396
+ },
1397
+ {
1398
+ "action": "validate_workspace_sender_invariant"
1399
+ },
1400
+ {
1401
+ "action": "bulk_approve_messages",
1402
+ "endpoint": "POST /api/v3/workflow-tables/cells/approve-batch",
1403
+ "reuseExisting": true,
1404
+ "doNotInventNewEndpoint": true
1405
+ },
1406
+ {
1407
+ "tool": "start_campaign",
1408
+ "requiredFields": [
1409
+ "campaignId"
1410
+ ]
1411
+ },
1412
+ {
1413
+ "tool": "update_campaign",
1414
+ "requiredFields": [
1415
+ "campaignId",
1416
+ "currentStep"
1417
+ ],
1418
+ "requiredValues": {
1419
+ "currentStep": "running"
1420
+ }
1421
+ },
1422
+ {
1423
+ "action": "surface_watch_link",
1424
+ "requires": [
1425
+ "create_campaign_succeeded",
1426
+ "save_rubrics_succeeded",
1427
+ "start_campaign_succeeded"
1428
+ ]
1429
+ }
1430
+ ],
1431
+ "allowedTools": [
1432
+ "get_campaign",
1433
+ "start_campaign",
1434
+ "update_campaign",
1435
+ "AskUserQuestion"
1436
+ ],
1437
+ "watchRequired": true,
1438
+ "waitFor": "campaign_started",
1439
+ "transitions": {
1440
+ "campaign_started": "running"
1441
+ }
1442
+ },
1443
+ {
1444
+ "id": "running",
1445
+ "label": "Campaign is live",
1446
+ "currentStepValue": "running",
1447
+ "onEnter": [
1448
+ {
1449
+ "action": "surface_watch_link"
1450
+ },
1451
+ {
1452
+ "action": "surface_campaign_live_confirmation"
1453
+ }
1454
+ ],
1455
+ "allowedTools": [
1456
+ "get_campaign",
1457
+ "AskUserQuestion"
1458
+ ],
1459
+ "doNotAllow": [
1460
+ "start_campaign"
1461
+ ],
1462
+ "terminal": true
1463
+ },
1464
+ {
1465
+ "id": "escalation",
1466
+ "label": "Escalation (autonomous tail exit)",
1467
+ "reference": "references/escalation-ladder.md",
1468
+ "onEnter": [
1469
+ {
1470
+ "action": "preserve_current_step"
1471
+ },
1472
+ {
1473
+ "action": "write_diagnostic_and_history",
1474
+ "target": "workflow_table_notes_or_skill_artifact"
1475
+ },
1476
+ {
1477
+ "action": "resume_watch_link"
1478
+ },
1479
+ {
1480
+ "action": "ask_user_options",
1481
+ "choices": [
1482
+ "revise-brief",
1483
+ "revise-leads",
1484
+ "abort",
1485
+ "resume-from-step"
1486
+ ]
1487
+ }
1488
+ ],
1489
+ "allowedTools": [
1490
+ "AskUserQuestion"
1491
+ ],
1492
+ "doNotAllow": [
1493
+ "start_campaign",
1494
+ "import_leads"
1495
+ ],
1496
+ "terminal": true
1497
+ },
1498
+ {
1499
+ "id": "revise-brief",
1500
+ "label": "Revise brief",
1501
+ "onEnter": [
1502
+ {
1503
+ "action": "route_back",
1504
+ "target": "phase-83-or-84"
1505
+ },
1506
+ {
1507
+ "action": "reset_draft_artifacts",
1508
+ "preserve": [],
1509
+ "delete": [
1510
+ "lead-review.md",
1511
+ "lead-sample.json",
1512
+ "lead-filter.md",
1513
+ "message-validation.md",
1514
+ "rubric.json"
1515
+ ]
1516
+ }
1517
+ ],
1518
+ "allowedTools": [
1519
+ "AskUserQuestion"
1520
+ ],
1521
+ "doNotAllow": [
1522
+ "create_campaign",
1523
+ "save_rubrics",
1524
+ "import_leads"
1525
+ ],
1526
+ "terminal": true
1527
+ },
1528
+ {
1529
+ "id": "revise-leads",
1530
+ "label": "Revise leads",
1531
+ "onEnter": [
1532
+ {
1533
+ "action": "route_back",
1534
+ "target": "phase-84-find-leads"
1535
+ },
1536
+ {
1537
+ "action": "reset_draft_artifacts",
1538
+ "preserve": [
1539
+ "brief.md"
1540
+ ],
1541
+ "delete": [
1542
+ "lead-review.md",
1543
+ "lead-sample.json",
1544
+ "lead-filter.md",
1545
+ "message-validation.md",
1546
+ "rubric.json"
1547
+ ]
1548
+ }
1549
+ ],
1550
+ "allowedTools": [
1551
+ "AskUserQuestion"
1552
+ ],
1553
+ "doNotAllow": [
1554
+ "create_campaign",
1555
+ "save_rubrics",
1556
+ "import_leads"
1557
+ ],
1558
+ "terminal": true
1559
+ },
1560
+ {
1561
+ "id": "revise-rubric",
1562
+ "label": "Revise rubric",
1563
+ "onEnter": [
1564
+ {
1565
+ "action": "route_back",
1566
+ "target": "phase-84-filter-leads"
1567
+ },
1568
+ {
1569
+ "action": "reset_draft_artifacts",
1570
+ "preserve": [
1571
+ "brief.md",
1572
+ "lead-review.md",
1573
+ "lead-sample.json"
1574
+ ],
1575
+ "delete": [
1576
+ "lead-filter.md",
1577
+ "message-validation.md",
1578
+ "rubric.json"
1579
+ ]
1580
+ }
1581
+ ],
1582
+ "allowedTools": [
1583
+ "AskUserQuestion"
1584
+ ],
1585
+ "doNotAllow": [
1586
+ "create_campaign",
1587
+ "save_rubrics",
1588
+ "import_leads"
1589
+ ],
1590
+ "terminal": true
1591
+ },
1592
+ {
1593
+ "id": "revise-messaging",
1594
+ "label": "Revise messaging",
1595
+ "onEnter": [
1596
+ {
1597
+ "action": "route_back",
1598
+ "target": "phase-84-generate-message"
1599
+ },
1600
+ {
1601
+ "action": "reset_draft_artifacts",
1602
+ "preserve": [
1603
+ "brief.md",
1604
+ "lead-review.md",
1605
+ "lead-sample.json",
1606
+ "lead-filter.md"
1607
+ ],
1608
+ "delete": [
1609
+ "message-validation.md"
1610
+ ]
1611
+ }
1612
+ ],
1613
+ "allowedTools": [
1614
+ "AskUserQuestion"
1615
+ ],
1616
+ "doNotAllow": [
1617
+ "create_campaign",
1618
+ "save_rubrics",
1619
+ "import_leads"
1620
+ ],
1621
+ "terminal": true
1622
+ },
1623
+ {
1624
+ "id": "abort",
1625
+ "label": "Abort",
1626
+ "onEnter": [
1627
+ {
1628
+ "action": "move_draft_dir",
1629
+ "target": ".aborted/"
1630
+ }
1631
+ ],
1632
+ "allowedTools": [
1633
+ "AskUserQuestion"
1634
+ ],
1635
+ "doNotAllow": [
1636
+ "create_campaign",
1637
+ "save_rubrics",
1638
+ "import_leads"
1639
+ ],
1640
+ "terminal": true
1641
+ }
1642
+ ]
1643
+ }