@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,232 @@
1
+ # Create Campaign Prompt Architecture
2
+
3
+ This document explains the architecture of the create-campaign prompt system,
4
+ what we learned from GSD, and how to extend the system safely.
5
+
6
+ ## What GSD Gets Right (Patterns to Reuse)
7
+
8
+ GSD is not "one big prompt." It is a layered system:
9
+
10
+ 1. Skills orchestrate
11
+ 2. Workflows define processes
12
+ 3. References capture reusable rules
13
+ 4. Templates standardize artifacts
14
+ 5. State files provide runtime memory
15
+ 6. Config files control modes, models, and gates
16
+
17
+ Key architectural ideas worth copying:
18
+
19
+ - Separation of concerns (orchestration vs execution vs policy)
20
+ - Versioned, file-based contracts (templates + frontmatter)
21
+ - Deterministic verification as a first-class workflow
22
+ - Explicit gating and safety rails
23
+ - Registry-style extensibility (map-codebase, templates, references)
24
+
25
+ ## Our Architecture Overview
26
+
27
+ We now follow a similar layered design for `/sellable:create-campaign`.
28
+
29
+ ### Layer 1: Skill Orchestrator
30
+
31
+ File:
32
+
33
+ - `mcp/sellable/skills/create-campaign/SKILL.md`
34
+
35
+ Responsibilities:
36
+
37
+ - Load the framework at runtime
38
+ - Apply overrides deterministically
39
+ - Execute the configured flow
40
+ - Keep the user oriented in watch mode
41
+
42
+ The skill is now a thin orchestrator, not the source of truth.
43
+
44
+ ### Layer 2: Framework Loader (Runtime Contract)
45
+
46
+ File:
47
+
48
+ - `mcp/sellable/src/tools/framework.ts`
49
+
50
+ Tools:
51
+
52
+ - `get_campaign_framework`
53
+ - `get_campaign_context`
54
+
55
+ `get_campaign_navigation_state` remains available for internal debugging but is
56
+ not part of the official skill interface.
57
+
58
+ `get_campaign_framework` loads all versioned configuration:
59
+
60
+ - Policy text
61
+ - Flow definition
62
+ - Provider registry
63
+ - Provider configs
64
+ - Plugin context
65
+ - Plugin overrides
66
+
67
+ This mirrors GSD's "load state/config first" pattern.
68
+
69
+ ### Layer 3: Policy (Invariant Rules)
70
+
71
+ File:
72
+
73
+ - `mcp/sellable/skills/create-campaign/core/policy.md`
74
+
75
+ Policy defines what must remain true even if other instructions drift:
76
+
77
+ - Bootstrap requirements
78
+ - Watch-mode protocol
79
+ - Debug-tool rules
80
+ - Wait-state rules
81
+ - Provider contract rules
82
+ - User-directed research overrides
83
+
84
+ This is our equivalent of GSD references.
85
+
86
+ ### Layer 4: Flow (State Machine)
87
+
88
+ File:
89
+
90
+ - `mcp/sellable/skills/create-campaign/core/flow.v1.json`
91
+
92
+ Flow is the state machine:
93
+
94
+ - Steps
95
+ - Required on-enter actions
96
+ - Wait conditions
97
+ - Transitions
98
+ - Watch-mode templates
99
+
100
+ This removes ambiguity from the main prompt.
101
+
102
+ ### Layer 5: Providers (Registry + Plugins)
103
+
104
+ Files:
105
+
106
+ - `mcp/sellable/skills/create-campaign/core/providers/registry.json`
107
+ - `mcp/sellable/skills/create-campaign/core/providers/*.json`
108
+
109
+ Each provider is now a plugin-style config with:
110
+
111
+ - `currentStep` mapping
112
+ - `leadSourceProvider` value
113
+ - `promptProvider` for `get_provider_prompt`
114
+ - Watch-mode text
115
+ - Recommendation metadata
116
+ - AskUserQuestion option text
117
+
118
+ This is the main extensibility surface for adding new providers.
119
+
120
+ ### Layer 6: Customization (User/Org Context + Overrides)
121
+
122
+ Files:
123
+
124
+ - `mcp/sellable/skills/create-campaign/context/registry.json`
125
+ - `mcp/sellable/skills/create-campaign/context/*.md`
126
+
127
+ Plugins provide two things:
128
+
129
+ 1. Freeform context (markdown)
130
+ 2. Structured overrides (in registry entries)
131
+
132
+ Overrides are merged in the loader and applied by the skill.
133
+
134
+ This is directly inspired by GSD's "state + config + references" layering.
135
+
136
+ ## Determinism Strategy
137
+
138
+ Determinism comes from configuration, not phrasing:
139
+
140
+ 1. The skill must load the framework before acting
141
+ 2. The flow defines what happens on step entry
142
+ 3. Provider configs define how selection maps to state
143
+ 4. Policy defines the guardrails
144
+ 5. Validation scripts check integrity offline
145
+
146
+ In practice, this means:
147
+
148
+ - No hardcoded provider tables in SKILL.md
149
+ - No provider-specific step mapping in prose
150
+ - Watch-mode behavior is a protocol, not a suggestion
151
+
152
+ ## Extensibility Strategy
153
+
154
+ ### Add a Provider
155
+
156
+ 1. Create `core/providers/<id>.json`
157
+ 2. Add it to `core/providers/registry.json`
158
+ 3. Ensure the provider prompt exists (if needed)
159
+ 4. Run:
160
+ - `npm run validate:create-campaign-framework`
161
+ - `npx tsc -p mcp/sellable/tsconfig.json --noEmit`
162
+
163
+ Provider config is the only place you should define:
164
+
165
+ - Step mapping
166
+ - Provider wiring
167
+ - Watch-mode copy
168
+
169
+ ### Add Custom Context or Overrides
170
+
171
+ 1. Add a context file in `context/`
172
+ 2. Register it in `context/registry.json`
173
+ 3. Put structured overrides in the registry entry
174
+ 4. Re-run the validator
175
+
176
+ Customization allows teams and users to shape behavior without editing the
177
+ orchestrator.
178
+
179
+ ## Validation and Safety Rails
180
+
181
+ We added an offline validator:
182
+
183
+ - `scripts/validate-create-campaign-framework.mjs`
184
+ - `npm run validate:create-campaign-framework`
185
+
186
+ This plays the same role as GSD's verification workflow:
187
+
188
+ - Ensure flows reference real steps
189
+ - Ensure providers are complete and consistent
190
+ - Ensure plugin files exist
191
+
192
+ We also ensure the JSON framework is versioned:
193
+
194
+ - Root `.gitignore` allows `web/mcp/sellable/skills/create-campaign/**/*.json`
195
+
196
+ ## Architecture Diagram (Mental Model)
197
+
198
+ Runtime call graph:
199
+
200
+ 1. Skill loads tools
201
+ 2. Skill calls `get_campaign_framework`
202
+ 3. Loader reads policy + flow + registries + plugins
203
+ 4. Skill executes flow using provider configs + policy rules
204
+ 5. Provider prompts remain the domain experts for search execution
205
+
206
+ This matches the GSD pattern:
207
+
208
+ - Orchestrator delegates execution expertise to specialized modules
209
+
210
+ ## What We Borrowed from GSD
211
+
212
+ From GSD, we explicitly adopted:
213
+
214
+ - Lean orchestration
215
+ - File-based contracts
216
+ - A runtime "load config first" step
217
+ - Separation between policy vs workflow vs implementation detail
218
+ - Verification as a separate concern
219
+
220
+ ## Suggested Next Improvements (Optional)
221
+
222
+ If we want to push this even closer to GSD-level determinism:
223
+
224
+ 1. Move recommendation logic into the framework tool
225
+ - e.g., `resolve_provider_recommendation(...)`
226
+ 2. Add tool availability detection for Chrome URL opening
227
+ - e.g., `get_client_capabilities`
228
+ 3. Add a flow validator that checks required tool fields per step
229
+ 4. Version provider prompts alongside provider configs
230
+
231
+ These are not required for the current architecture to work, but they would
232
+ reduce prompt-level decision-making further.
@@ -0,0 +1,296 @@
1
+ # Create Campaign - Design Discussion
2
+
3
+ Purpose: align on how the create-campaign system should work before adding
4
+ more features.
5
+
6
+ This doc is for decisions, not implementation details.
7
+
8
+ ---
9
+
10
+ ## 1) What the user runs
11
+
12
+ User interface stays simple:
13
+
14
+ - `/sellable:create-campaign`
15
+
16
+ Everything else is internal structure that loads automatically.
17
+
18
+ ---
19
+
20
+ ## 2) Current runtime architecture (as built)
21
+
22
+ At the start of every run:
23
+
24
+ 1. `SKILL.md` calls `get_campaign_framework({ flowVersion: "v1", includePlugins: true })`
25
+ 2. The framework loader reads from:
26
+ - Core system config: `core/`
27
+ - User/org context: `context/`
28
+
29
+ During the run, state is confirmed server-side:
30
+
31
+ - `update_campaign(...)` returns `navigation` diagnostics immediately
32
+ - `get_campaign_context({ campaignId })` returns cached framework + navigation
33
+ - After `confirm_lead_list(...)`, advance UI immediately with
34
+ `update_campaign({ currentStep: "filter-choice" })`, then gate on
35
+ `wait_for_campaign_table_ready({ campaignId })` and sample via
36
+ `get_rows_minimal(...)` for the filter recommendation
37
+
38
+ Provider search expertise is still injected separately via:
39
+
40
+ - `get_provider_prompt(...)` -> `mcp/sellable/skills/providers/*.md`
41
+
42
+ So there are two kinds of prompt injection:
43
+
44
+ 1. Framework injection (policy + flow + providers + context)
45
+ 2. Provider prompt injection (provider-specific search playbooks)
46
+
47
+ ---
48
+
49
+ ## 3) Folder structure and touch zones
50
+
51
+ Goal: a user should know what they can safely edit by looking at the tree.
52
+
53
+ Safe to edit:
54
+
55
+ - `context/context.md` (business context)
56
+ - `context/registry.json` (defaults and overrides)
57
+ - `context/learnings.md` (notes)
58
+
59
+ System-owned (edit rarely and intentionally):
60
+
61
+ - `core/policy.md`
62
+ - `core/flow.v1.json`
63
+ - `core/providers/*.json`
64
+
65
+ Orchestrator (do not edit for normal customization):
66
+
67
+ - `SKILL.md`
68
+
69
+ ---
70
+
71
+ ## 4) Flow map and gating model
72
+
73
+ Gates are intentional. After UI state changes, the assistant should orient and
74
+ wait.
75
+
76
+ High-level flow:
77
+
78
+ 1. Bootstrap
79
+ 2. Discovery + enrichment
80
+ 3. Direction + onboarding
81
+ 4. Create campaign (Gate: review brief)
82
+ 5. Move to provider selection (Gate: confirm step is visible)
83
+ 6. Move to provider step (Gate: confirm provider UI is visible)
84
+ 7. Provider prompt injection + search
85
+ 8. Import leads -> review list -> confirm (Gate: confirm list looks right)
86
+ 9. Enable filtering (yes/no) then handoff to rubric/messages
87
+
88
+ Gating rule:
89
+
90
+ - After every `update_campaign({ currentStep: ... })`: check returned `navigation`, orient in watch mode, and wait for confirmation.
91
+
92
+ Import rule:
93
+
94
+ - After `import_leads(...)`, call `wait_for_lead_list_ready({ campaignOfferId })`
95
+ before asking the user to confirm the list.
96
+ - After `confirm_lead_list(...)`, call `update_campaign({ currentStep: "filter-choice" })`
97
+ immediately, then `wait_for_campaign_table_ready({ campaignId })`, then
98
+ `get_campaign_context({ refresh: true })` + `get_rows_minimal(...)`.
99
+
100
+ Debug rule:
101
+
102
+ - Only use Chrome tools when the user says something is wrong.
103
+
104
+ ---
105
+
106
+ ## 5) Proposed data model (MVP contract)
107
+
108
+ This is the minimum contract we should agree on and then enforce.
109
+
110
+ ### 5.1 Framework response shape
111
+
112
+ ```ts
113
+ type CampaignFramework = {
114
+ version: "v1";
115
+ flowVersion: "v1";
116
+ policy: string;
117
+ flow: FlowConfig;
118
+
119
+ providerRegistry: ProviderRegistry;
120
+ providers: Record<ProviderId, ProviderConfig>;
121
+
122
+ contextRegistry: ContextRegistry;
123
+ contextEntries: LoadedContextEntry[];
124
+ overrides: FrameworkOverrides;
125
+
126
+ warnings: string[];
127
+ };
128
+ ```
129
+
130
+ ### 5.2 Providers
131
+
132
+ ```ts
133
+ type ProviderId = "signal-discovery" | "sales-nav" | "apollo";
134
+
135
+ type ProviderConfig = {
136
+ id: ProviderId;
137
+ label: string;
138
+ leadSourceProvider: string;
139
+ currentStep: string;
140
+ promptProvider: "signal-discovery" | "sales-nav" | "apollo";
141
+
142
+ requiredTools: string[];
143
+ watch: { stepVisible: string; afterImport: string };
144
+ askOption: { label: string; description: string };
145
+ };
146
+ ```
147
+
148
+ ### 5.3 Context entries (currently called plugins)
149
+
150
+ We can keep the current JSON key (`plugins`) but treat each item as a context
151
+ entry.
152
+
153
+ ```ts
154
+ type ContextRegistry = {
155
+ version: "v1";
156
+ plugins: ContextEntry[];
157
+ };
158
+
159
+ type ContextEntry = {
160
+ id: string;
161
+ path: string;
162
+ enabled: boolean;
163
+ description?: string;
164
+ overrides?: FrameworkOverrides;
165
+ };
166
+ ```
167
+
168
+ ### 5.4 Overrides
169
+
170
+ ```ts
171
+ type FrameworkOverrides = {
172
+ providerPreference?: ProviderId;
173
+ providerOrder?: ProviderId[];
174
+ defaultLeadTarget?: number;
175
+ researchMode?: "framework-driven" | "user-directed";
176
+ researchNotes?: string;
177
+ };
178
+ ```
179
+
180
+ ---
181
+
182
+ ## 6) Decisions to lock (proposed)
183
+
184
+ If you agree, we can treat these as v1 decisions.
185
+
186
+ 1. The interface remains `/sellable:create-campaign`
187
+ 2. `context/` is the only user-safe customization surface
188
+ 3. Provider prompts stay in `mcp/sellable/skills/providers/*.md`
189
+ 4. Gates are required after every `currentStep` change
190
+ 5. We do not support manual upload yet (3 providers only)
191
+
192
+ ---
193
+
194
+ ## 7) Open questions
195
+
196
+ Use this section as a checklist.
197
+
198
+ - Should we rename `plugins` -> `contextEntries` in the registry JSON?
199
+ - Should provider recommendation logic move into MCP (tool) vs prompt?
200
+ - Should we add a capabilities tool so gating can be verified via Chrome when available?
201
+ - Do we want per-workspace context files later, or keep repo-only for now?
202
+
203
+ ---
204
+
205
+ ## 8) ASCII flow map (what loads, when, and why)
206
+
207
+ This is the end-to-end control flow for `/sellable:create-campaign`.
208
+
209
+ ```text
210
+ USER
211
+ |
212
+ | invokes /sellable:create-campaign
213
+ v
214
+ SKILL: mcp/sellable/skills/create-campaign/SKILL.md
215
+ |
216
+ |-- ToolSearch (bootstrap tools)
217
+ |
218
+ |-- get_campaign_framework({ flowVersion: "v1", includePlugins: true })
219
+ | |
220
+ | v
221
+ | TOOL: mcp/sellable/src/tools/framework.ts
222
+ | |
223
+ | |-- loads core policy:
224
+ | | mcp/sellable/skills/create-campaign/core/policy.md
225
+ | |
226
+ | |-- loads state machine flow:
227
+ | | mcp/sellable/skills/create-campaign/core/flow.v1.json
228
+ | |
229
+ | |-- loads provider registry:
230
+ | | mcp/sellable/skills/create-campaign/core/providers/registry.json
231
+ | | -> then loads each provider config it references
232
+ | | (apollo.json, sales-nav.json, signal-discovery.json)
233
+ | |
234
+ | |-- loads context registry:
235
+ | | mcp/sellable/skills/create-campaign/context/registry.json
236
+ | | -> then loads each enabled context entry it references
237
+ | | (for example: context/context.md, context/learnings.md)
238
+ | |
239
+ | '-- returns: policy + flow + providers + context entries + overrides
240
+ |
241
+ |== From here on, the flow is driven by core/flow.v1.json ==
242
+ |
243
+ | Step 1: campaign-created (Campaign Brief)
244
+ | - Tool: create_campaign(...)
245
+ | - No currentStep jump yet
246
+ |
247
+ | Step 2: pick-provider (Provider Selection)
248
+ | - Tool: update_campaign({ campaignId, currentStep: "pick-provider" })
249
+ | - Result: update_campaign returns navigation diagnostics
250
+ | - Watch gate: tell user what changed -> wait for confirmation
251
+ |
252
+ | Step 3: provider-search (Provider Search)
253
+ | - Tool: update_campaign({ campaignId, currentStep, leadSourceProvider })
254
+ | - Tool: get_provider_prompt({ provider })
255
+ | -> loads provider instructions from:
256
+ | mcp/sellable/skills/providers/{provider}.md
257
+ | - Tools: search_* -> import_leads(...) -> wait_for_lead_list_ready(...) -> confirm_lead_list(...)
258
+ | - Wait for user confirmation on lead list
259
+ | - Tool: confirm_lead_list({ campaignId })
260
+ | - Tool: update_campaign({ campaignId, currentStep: "filter-choice" }) // move UI immediately after confirm
261
+ | - Tool: wait_for_campaign_table_ready({ campaignId })
262
+ | - Tool: get_campaign_context({ campaignId, refresh: true })
263
+ | - Tool: get_rows_minimal({ tableId: workflowTableId, ... })
264
+ | - Watch gate + recommendation after sample
265
+ |
266
+ | Step 4: confirm-lead-list (Confirm Lead List)
267
+ | - Tool: update_campaign({ campaignId, currentStep: "confirm-lead-list" })
268
+ | - Result: update_campaign returns navigation diagnostics
269
+ | - Tool: get_campaign_context({ campaignId, refresh: true }) when needed
270
+ | - Watch gate: confirm the list looks right
271
+ |
272
+ | Step 5: filter-choice (Enable Filtering)
273
+ | - Tool: update_campaign({ campaignId, currentStep: "filter-choice" })
274
+ | Step 6: filter-rules (Rubric Builder)
275
+ | - Tool: update_campaign({ campaignId, currentStep: "filter-rules" })
276
+ | Step 7: handoff (Terminal)
277
+ | - Action: handoff_to_subskill -> /sellable:create-rubric
278
+ ```
279
+
280
+ If you want, we can also add this same map (shorter) to
281
+ `mcp/sellable/skills/create-campaign/README.md` so the structure explains itself.
282
+
283
+ ---
284
+
285
+ ## 9) Are we overengineering this?
286
+
287
+ Mostly no. The core is still small:
288
+
289
+ 1. `get_campaign_framework`
290
+ 2. `update_campaign` (returns `navigation`)
291
+ 3. `import_leads`
292
+ 4. `confirm_lead_list`
293
+ 5. `wait_for_campaign_table_ready`
294
+ 6. `get_campaign_context`
295
+
296
+ `get_campaign_navigation_state` is internal/debug only.