@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,240 @@
1
+ # Create Campaign MCP Flow (ASCII Audit + Streamlined Proposal)
2
+
3
+ Scope: /sellable:create-campaign
4
+ Sources: mcp/sellable/skills/create-campaign/SKILL.md, core/flow.v1.json, core/providers/_.json,
5
+ mcp/sellable/skills/providers/_.md, mcp/sellable/src/server.ts
6
+
7
+ Note: Tool names are shown without the mcp**sellable** prefix. AskUserQuestion is the UI question tool.
8
+
9
+ ======================================================================
10
+ TOOL AUDIT (CREATE CAMPAIGN)
11
+ ======================================================================
12
+
13
+ Bootstrap / Guardrails (required)
14
+
15
+ - ToolSearch(select: ...)
16
+ - get_auth_status
17
+ - get_campaign_framework
18
+ - get_campaign_context (resume, refresh)
19
+ - get_subskill_prompt (research + handoff)
20
+ - search_subskill_prompts (only if subskill name unclear)
21
+
22
+ Discovery / Enrichment (required)
23
+
24
+ - enrich_sender (returns clientProspectId, personData, companyDomain)
25
+
26
+ Research (optional, parallel; only when needed)
27
+
28
+ - fetch_linkedin_posts (LinkedIn posts)
29
+ - fetch_company (company LinkedIn data)
30
+ - WebFetch (homepage)
31
+ - WebSearch (jobs/funding, reviews/traffic)
32
+
33
+ Campaign Creation / Updates
34
+
35
+ - create_campaign (requires clientProspectId + campaignBrief; offerPositioning auto-filled)
36
+ - update_campaign (currentStep, leadSourceProvider)
37
+ - update_campaign_brief (refine brief)
38
+
39
+ Lead Sourcing
40
+
41
+ - get_provider_prompt (provider-specific instructions)
42
+ - search_signals / select_promising_posts / set_headline_icp_criteria
43
+ - search_sales_nav
44
+ - lookup_sales_nav_filter (Sales Nav dynamic filters)
45
+ - search_apollo
46
+ - import_leads
47
+ - wait_for_lead_list_ready
48
+ - confirm_lead_list
49
+ - wait_for_campaign_table_ready
50
+
51
+ Watch / UI / Diagnostics
52
+
53
+ - AskUserQuestion
54
+ - get_campaign_navigation_state (debug)
55
+ - Chrome tools read_page/get_page_text (debug only)
56
+
57
+ Handoff (next phase)
58
+
59
+ - get_subskill_prompt (create-rubric)
60
+ - upsert_rubric (downstream, not in this flow)
61
+
62
+ ======================================================================
63
+ CURRENT FLOW (V1) - ASCII
64
+ ======================================================================
65
+
66
+ [User: /sellable:create-campaign (cmp_... optional)]
67
+ |
68
+ v
69
+ [ToolSearch: load required tools]
70
+ |
71
+ v
72
+ [get_auth_status] --auth fail--> [Stop: show guidance; wait for "ready"]
73
+ |
74
+ v
75
+ [get_campaign_framework]
76
+ |
77
+ +--> cmp_id provided?
78
+ | |
79
+ | +-- yes --> [create_campaign(campaignId) -> watchUrl]
80
+ | [get_campaign_context(refresh)]
81
+ | [Resume via context.navState]
82
+ | [Jump into flow at matching step]
83
+ |
84
+ +-- no --> continue
85
+ |
86
+ v
87
+ [Need LinkedIn URL? AskUserQuestion]
88
+ |
89
+ v
90
+ [enrich_sender -> clientProspectId, personData, companyDomain]
91
+ |
92
+ v
93
+ [Research subskill (parallel, optional)]
94
+ |
95
+ v
96
+ [Ask direction]
97
+ |\
98
+ | +-- "I have a direction" --> [User gives target/angle] --> (skip Q sets)
99
+ | +-- "Lead the way" -------> [Onboarding Q set 1] -> [Onboarding Q set 2]
100
+ |
101
+ v
102
+ [Generate 3 JTBD options] -> [User picks]
103
+ |
104
+ v
105
+ [create_campaign (campaignBrief)]
106
+ |
107
+ v
108
+ [Watch link gate] -- wait for "ready for leads" -->
109
+ |
110
+ v
111
+ [update_campaign currentStep=pick-provider] -> (watch gate)
112
+ |
113
+ v
114
+ [AskUserQuestion provider] -> [resolve provider]
115
+ |
116
+ v
117
+ [update_campaign currentStep=provider step + leadSourceProvider] -> (watch gate)
118
+ |
119
+ v
120
+ [get_provider_prompt]
121
+ |
122
+ v
123
+ (Provider search path)
124
+ |
125
+ v
126
+ [import_leads] -> [wait_for_lead_list_ready] -> [confirm_lead_list]
127
+ |
128
+ v
129
+ [update_campaign currentStep=filter-choice] -> (watch gate)
130
+ |
131
+ v
132
+ [wait_for_campaign_table_ready] -> [get_campaign_context refresh] -> [get_rows_minimal sample]
133
+ |
134
+ v
135
+ [if filters=yes -> update_campaign currentStep=filter-rules] -> (watch gate)
136
+ |
137
+ v
138
+ [handoff_to_subskill create-rubric]
139
+
140
+ Provider search paths
141
+
142
+ Signal Discovery
143
+ search_signals
144
+ -> select_promising_posts
145
+ -> set_headline_icp_criteria
146
+ -> import_leads
147
+ -> confirm_lead_list
148
+
149
+ Sales Navigator
150
+ (lookup_sales_nav_filter as needed)
151
+ -> search_sales_nav
152
+ -> import_leads
153
+ -> confirm_lead_list
154
+
155
+ Apollo
156
+ search_apollo
157
+ -> import_leads
158
+ -> confirm_lead_list
159
+
160
+ ======================================================================
161
+ STREAMLINED FLOW (PROPOSED FAST PATH - DESIGN UPDATE)
162
+ ======================================================================
163
+
164
+ Goal: reach the watch link (magic moment) ASAP while staying deterministic.
165
+ Rules: ask only what is strictly needed; prefer user-confirm > user-question.
166
+
167
+ [User: /sellable:create-campaign (cmp_... optional)]
168
+ |
169
+ v
170
+ [ToolSearch + get_auth_status + get_campaign_framework]
171
+ |
172
+ +-- cmp_id provided --> [create_campaign(campaignId) -> watchUrl]
173
+ | [get_campaign_context(refresh)] -> resume
174
+ |
175
+ v
176
+ [If LinkedIn URL missing] -> AskUserQuestion (single ask)
177
+ |
178
+ v
179
+ [enrich_sender]
180
+ |
181
+ v
182
+ [Ask 1 question only: "Who do you want to reach?"]
183
+ |
184
+ v
185
+ [Do we already have a clear campaign angle/offer from context?]
186
+ |\
187
+ | +-- yes --> (skip research)
188
+ | |
189
+ | +-- no --> [Minimal research (2 agents max: posts + homepage)]
190
+ |
191
+ v
192
+ [Auto-pick 1 default campaign angle + draft brief]
193
+ |
194
+ v
195
+ [create_campaign NOW] <-- magic moment (watch link)
196
+ |
197
+ v
198
+ [Optional refinements while user reviews]
199
+
200
+ - Only ask if user objects or wants options
201
+ - update_campaign_brief if needed
202
+ |
203
+ v
204
+ [Auto-recommend provider + AskUserQuestion: confirm/change]
205
+ |
206
+ v
207
+ [update_campaign -> provider step] -> get_provider_prompt
208
+ |
209
+ v
210
+ [Run search + import leads] -> [wait_for_lead_list_ready] -> [confirm_lead_list]
211
+ |
212
+ v
213
+ [update_campaign currentStep=filter-choice] -> [wait_for_campaign_table_ready] -> [get_campaign_context] -> [get_rows_minimal]
214
+ |
215
+ v
216
+ [filter-rules] -> handoff to create-rubric
217
+
218
+ Suggested question budget (fast path)
219
+
220
+ - Required: LinkedIn URL (only if missing)
221
+ - Required: 1 question max (ICP / who to reach)
222
+ - Optional: Ask for campaign angle only if user wants options
223
+
224
+ Research gating (fast path)
225
+
226
+ - Skip research by default after ICP is known.
227
+ - If only company domain exists, run Homepage Snapshot only.
228
+ - If speed is priority, set research agentCount=2 (posts + homepage).
229
+
230
+ ======================================================================
231
+ NOTES / DESIGN INTENT
232
+ ======================================================================
233
+
234
+ - The earliest "magic moment" is the watch link returned by create_campaign.
235
+ - create_campaign requires clientProspectId + offerPositioning + campaignBrief.
236
+ The fast path focuses on collecting only the brief; offerPositioning can be
237
+ auto-filled server-side to avoid delaying the watch link.
238
+ - Every update_campaign step is a watch-mode gate in the current flow.
239
+ The fast path keeps gates but reduces question count and research scope.
240
+ - Provider selection can be simplified to: "Recommended: X (yes/change?)".
@@ -0,0 +1,49 @@
1
+ # Host Parity Checklist (Create Campaign)
2
+
3
+ Use this checklist to verify Codex and Claude behavior stays aligned.
4
+ Record factual evidence for each item.
5
+
6
+ ## Run Metadata
7
+
8
+ - Date:
9
+ - Operator:
10
+ - Workspace:
11
+ - Campaign ID (if resume):
12
+
13
+ ## Codex Run Checklist
14
+
15
+ - [ ] Bootstrap sequence executed via `bootstrap_create_campaign`
16
+ - Evidence:
17
+ - [ ] `requiredChecks` includes auth/framework/resume/subskill checks
18
+ - Evidence:
19
+ - [ ] Fail-fast behavior observed when bootstrap has blockers (`Bootstrap incomplete`)
20
+ - Evidence:
21
+ - [ ] `list_subskill_prompts` and `get_subskill_prompt("create-campaign")` available
22
+ - Evidence:
23
+ - [ ] Provider preflight executed with `get_provider_prompt`
24
+ - Evidence:
25
+ - [ ] Provider search/import blocked before preflight and allowed after preflight
26
+ - Evidence:
27
+ - [ ] Resume behavior (when campaignId passed) continues from context, not new campaign creation
28
+ - Evidence:
29
+
30
+ ## Claude Non-Regression Checklist
31
+
32
+ - [ ] Existing slash flow remains valid (`/sellable:create-campaign`)
33
+ - Evidence:
34
+ - [ ] No additional mandatory user setup beyond prior Claude flow
35
+ - Evidence:
36
+ - [ ] Required tool names remain unchanged and callable
37
+ - Evidence:
38
+ - [ ] Auth guidance remains actionable when token/workspace is missing
39
+ - Evidence:
40
+ - [ ] Provider gating remediation text is clear and actionable
41
+ - Evidence:
42
+ - [ ] Prompt discovery fallback works when host prompt UI is limited
43
+ - Evidence:
44
+
45
+ ## Verdict
46
+
47
+ - Codex parity status: PASS / FAIL
48
+ - Claude non-regression status: PASS / FAIL
49
+ - Follow-up actions:
@@ -0,0 +1,142 @@
1
+ # Create Campaign Framework (MVP Guide)
2
+
3
+ This is the smallest clean version that is both deterministic and extensible.
4
+ If you only read one file, read this one.
5
+
6
+ ## Start Here (What to do)
7
+
8
+ 1. Put your business context in `context/context.md`
9
+ 2. Set deterministic overrides in `context/registry.json`
10
+ 3. (Optional) Adjust provider behavior in `core/providers/*.json`
11
+ 4. Validate with `npm run validate:create-campaign-framework`
12
+
13
+ That is the MVP operating loop.
14
+
15
+ ## Host Parity Contract (Codex + Claude)
16
+
17
+ Use the same runtime sequence in both hosts:
18
+
19
+ 1. `bootstrap_create_campaign({ campaignId? })`
20
+ 2. If `safeToProceed !== true`, stop and resolve `blockingErrors`
21
+ 3. Continue with framework/context flow only after bootstrap passes
22
+
23
+ Prompt discovery contract for hosts without prompts/list UI:
24
+
25
+ - `list_subskill_prompts`
26
+ - `search_subskill_prompts`
27
+ - `get_subskill_prompt({ subskillName: "create-campaign" })`
28
+
29
+ Provider preflight contract:
30
+
31
+ - Always call `get_provider_prompt({ provider, campaignOfferId? })` before provider search/import tools.
32
+ - Provider tools are runtime-gated until this preflight call is made.
33
+
34
+ Parallel execution contract:
35
+
36
+ - Claude host: use `Task` subagents for parallel research/crafting units.
37
+ - Codex host: use `multi_tool_use.parallel` for independent tool-call batches.
38
+ - If neither is available, run sequentially with the same output schema.
39
+
40
+ ## How a run works (mental model)
41
+
42
+ 1. `SKILL.md` calls `get_campaign_framework`
43
+ 2. The framework loader returns:
44
+ - Policy (`core/policy.md`)
45
+ - Flow (`core/flow.v1.json`)
46
+ - Providers (`core/providers/*.json`)
47
+ - Custom context + overrides (`context/*`)
48
+ 3. The skill executes the flow using those configs
49
+
50
+ ## Flow map (what happens and where it gates)
51
+
52
+ 1. Bootstrap
53
+ - Load tools
54
+ - Call `get_campaign_framework({ flowVersion: "v1", includePlugins: true })`
55
+ 2. Discovery + enrichment
56
+ - `enrich_sender` -> capture `clientProspectId`
57
+ - Parallel sender research
58
+ - `complete_sender_research(...)` marker before create
59
+ 3. Quick inputs
60
+ - Confirm identity
61
+ - Ask for ICP + campaign idea (proof optional)
62
+ 4. Create campaign (Gate 1)
63
+ - `create_campaign(...)`
64
+ - Provide watch link
65
+ - Gate: user reviews brief and confirms ready
66
+ 5. Move to provider selection (Gate 2)
67
+ - `update_campaign({ currentStep: "pick-provider" })`
68
+ - Gate: confirm they see provider selection
69
+ 6. Move to provider step (Gate 3)
70
+ - Use `core/providers/<id>.json` for `currentStep` + `leadSourceProvider`
71
+ - `update_campaign({ currentStep, leadSourceProvider })`
72
+ - Gate: confirm they see the provider step
73
+ 7. Provider prompt injection + search
74
+ - Call `get_provider_prompt({ provider: providerConfig.promptProvider })`
75
+ - Execute the provider's workflow
76
+ 8. Import leads -> review list -> confirm (Gate 4)
77
+ - `import_leads(...)` (creates lead list + starts import)
78
+ - `wait_for_lead_list_ready(...)`
79
+ - Gate: confirm the list looks right
80
+ - `confirm_lead_list(...)` (imports into campaign table)
81
+ - `update_campaign({ currentStep: "filter-choice" })` (move watch UI immediately)
82
+ - `wait_for_campaign_table_ready(...)` (required readiness check)
83
+ - `get_campaign_context({ refresh: true })` + `get_rows_minimal(...)` (sample leads for recommendation)
84
+ 9. Enable filtering (Gate 5)
85
+ - Gate: user chooses whether to add filters or skip
86
+ 10. Handoff
87
+
88
+ - Provide watch link + status
89
+ - If filters=yes: `update_campaign({ currentStep: "filter-rules" })` then hand off to rubric
90
+ - If filters=no: `update_campaign({ currentStep: "messages" })` then proceed to messaging
91
+
92
+ Notes:
93
+
94
+ - Gates are intentional: after every `currentStep` change, the skill orients
95
+ the user and waits.
96
+ - Chrome tools are only used when the user says something is wrong.
97
+
98
+ ## Folder structure (explains itself)
99
+
100
+ - `SKILL.md` - Orchestrator (thin; not the source of truth)
101
+ - `core/` - System-owned framework (rarely edit)
102
+ - `core/policy.md` - Non-negotiable rules
103
+ - `core/flow.v1.json` - Step graph and transitions
104
+ - `core/providers/registry.json` - Provider index and order
105
+ - `core/providers/*.json` - Provider contracts (step mapping + copy)
106
+ - `context/` - Your space (edit these)
107
+ - `context/context.md` - Your default context
108
+ - `context/registry.json` - What is enabled + overrides
109
+ - `context/learnings.md` - What worked (learning log)
110
+ - `context/README.md` - How to customize safely
111
+
112
+ ## Where to change behavior (fast path)
113
+
114
+ Most changes should happen here:
115
+
116
+ - Add org/user context: `context/context.md`
117
+ - Change defaults and recommendation behavior: `context/registry.json`
118
+
119
+ Advanced changes:
120
+
121
+ - Change provider step wiring or watch text: `core/providers/<id>.json`
122
+ - Change global behavior: `core/policy.md`
123
+ - Change the flow: `core/flow.v1.json`
124
+
125
+ ## Add a provider (extensible contract)
126
+
127
+ 1. Copy an existing provider file in `core/providers/`
128
+ 2. Edit `id`, `currentStep`, `leadSourceProvider`, and `askOption`
129
+ 3. Add it to `core/providers/registry.json`
130
+ 4. Validate with `npm run validate:create-campaign-framework`
131
+
132
+ ## Add context or overrides (customization)
133
+
134
+ 1. Add a context file under `context/`
135
+ 2. Register it in `context/registry.json`
136
+ 3. Put structured overrides in the registry entry
137
+ 4. Validate with `npm run validate:create-campaign-framework`
138
+
139
+ ## Determinism checks
140
+
141
+ - `npm run validate:create-campaign-framework`
142
+ - `npx tsc -p mcp/sellable/tsconfig.json --noEmit`