@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.
- package/.claude-plugin/plugin.json +12 -0
- package/.mcp.json +9 -0
- package/README.md +355 -0
- package/dist/api.d.ts +21 -0
- package/dist/api.js +73 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.js +246 -0
- package/dist/engage-memory.d.ts +63 -0
- package/dist/engage-memory.js +354 -0
- package/dist/index-dev.d.ts +2 -0
- package/dist/index-dev.js +17 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +499 -0
- package/dist/skills.d.ts +11 -0
- package/dist/skills.js +97 -0
- package/dist/tools/auth.d.ts +30 -0
- package/dist/tools/auth.js +124 -0
- package/dist/tools/blueprint-commit.d.ts +174 -0
- package/dist/tools/blueprint-commit.js +286 -0
- package/dist/tools/bootstrap.d.ts +64 -0
- package/dist/tools/bootstrap.js +246 -0
- package/dist/tools/campaigns.d.ts +589 -0
- package/dist/tools/campaigns.js +892 -0
- package/dist/tools/cells.d.ts +58 -0
- package/dist/tools/cells.js +48 -0
- package/dist/tools/context.d.ts +88 -0
- package/dist/tools/context.js +271 -0
- package/dist/tools/csv-domains.d.ts +73 -0
- package/dist/tools/csv-domains.js +464 -0
- package/dist/tools/csv-linkedin.d.ts +102 -0
- package/dist/tools/csv-linkedin.js +712 -0
- package/dist/tools/direct-campaigns.d.ts +240 -0
- package/dist/tools/direct-campaigns.js +250 -0
- package/dist/tools/engage-bootstrap.d.ts +94 -0
- package/dist/tools/engage-bootstrap.js +205 -0
- package/dist/tools/engage-discovery.d.ts +78 -0
- package/dist/tools/engage-discovery.js +150 -0
- package/dist/tools/engage-memory.d.ts +181 -0
- package/dist/tools/engage-memory.js +143 -0
- package/dist/tools/engage-state.d.ts +72 -0
- package/dist/tools/engage-state.js +62 -0
- package/dist/tools/enrichment.d.ts +167 -0
- package/dist/tools/enrichment.js +174 -0
- package/dist/tools/flow-preflight.d.ts +68 -0
- package/dist/tools/flow-preflight.js +138 -0
- package/dist/tools/framework.d.ts +44 -0
- package/dist/tools/framework.js +153 -0
- package/dist/tools/interaction-mode.d.ts +27 -0
- package/dist/tools/interaction-mode.js +102 -0
- package/dist/tools/leads.d.ts +2417 -0
- package/dist/tools/leads.js +2307 -0
- package/dist/tools/linkedin.d.ts +210 -0
- package/dist/tools/linkedin.js +229 -0
- package/dist/tools/navigation.d.ts +91 -0
- package/dist/tools/navigation.js +381 -0
- package/dist/tools/one-off.d.ts +229 -0
- package/dist/tools/one-off.js +273 -0
- package/dist/tools/processing.d.ts +70 -0
- package/dist/tools/processing.js +56 -0
- package/dist/tools/prompts.d.ts +211 -0
- package/dist/tools/prompts.js +210 -0
- package/dist/tools/provider-preflight.d.ts +21 -0
- package/dist/tools/provider-preflight.js +59 -0
- package/dist/tools/readiness.d.ts +261 -0
- package/dist/tools/readiness.js +510 -0
- package/dist/tools/rows.d.ts +126 -0
- package/dist/tools/rows.js +105 -0
- package/dist/tools/rubrics.d.ts +497 -0
- package/dist/tools/rubrics.js +681 -0
- package/dist/tools/senders.d.ts +44 -0
- package/dist/tools/senders.js +69 -0
- package/dist/tools/sequencer.d.ts +127 -0
- package/dist/tools/sequencer.js +194 -0
- package/dist/tools/tables.d.ts +35 -0
- package/dist/tools/tables.js +36 -0
- package/dist/tools/verify-row.d.ts +36 -0
- package/dist/tools/verify-row.js +38 -0
- package/dist/tools/workspaces.d.ts +140 -0
- package/dist/tools/workspaces.js +139 -0
- package/dist/utils/workspace-root.d.ts +1 -0
- package/dist/utils/workspace-root.js +39 -0
- package/package.json +46 -0
- package/skills/building-gtm-tables/SKILL.md +216 -0
- package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
- package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
- package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
- package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
- package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
- package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
- package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
- package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
- package/skills/building-gtm-tables/references/verify-loop.md +74 -0
- package/skills/campaign-messages/SKILL.md +173 -0
- package/skills/campaign-messages/flow.v1.json +75 -0
- package/skills/craft-message/SKILL.md +401 -0
- package/skills/create-campaign/ARCHITECTURE.md +232 -0
- package/skills/create-campaign/DISCUSS.md +296 -0
- package/skills/create-campaign/FLOW_ASCII.md +240 -0
- package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
- package/skills/create-campaign/README.md +142 -0
- package/skills/create-campaign/SKILL.md +286 -0
- package/skills/create-campaign/context/README.md +67 -0
- package/skills/create-campaign/context/_TEMPLATE.md +12 -0
- package/skills/create-campaign/context/context.md +35 -0
- package/skills/create-campaign/context/learnings.md +16 -0
- package/skills/create-campaign/context/registry.json +19 -0
- package/skills/create-campaign/core/flow.v1.json +217 -0
- package/skills/create-campaign/core/policy.md +191 -0
- package/skills/create-campaign/core/providers/apollo.json +35 -0
- package/skills/create-campaign/core/providers/prospeo.json +34 -0
- package/skills/create-campaign/core/providers/registry.json +31 -0
- package/skills/create-campaign/core/providers/sales-nav.json +37 -0
- package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
- package/skills/create-campaign/references/brief-template.md +64 -0
- package/skills/create-campaign/references/campaign-quality.md +84 -0
- package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
- package/skills/create-campaign/references/offer-patterns.md +108 -0
- package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
- package/skills/create-campaign/references/question-examples.md +167 -0
- package/skills/create-campaign/references/token-fill-examples.md +81 -0
- package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
- package/skills/create-campaign-brief/DISCUSS.md +64 -0
- package/skills/create-campaign-brief/README.md +176 -0
- package/skills/create-campaign-brief/SKILL.md +537 -0
- package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
- package/skills/create-campaign-brief/references/brief-template.md +220 -0
- package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
- package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
- package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
- package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
- package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
- package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
- package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
- package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
- package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
- package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
- package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
- package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
- package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
- package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
- package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
- package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
- package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
- package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
- package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
- package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
- package/skills/create-campaign-v2/SKILL.md +1619 -0
- package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
- package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
- package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
- package/skills/create-campaign-v2/core/policy.md +82 -0
- package/skills/create-campaign-v2/references/ai-tells.md +253 -0
- package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
- package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
- package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
- package/skills/create-campaign-v2/references/filter-leads.md +495 -0
- package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
- package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
- package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
- package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
- package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
- package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
- package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
- package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
- package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
- package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
- package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
- package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
- package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
- package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
- package/skills/create-campaign-v2-validation/SKILL.md +296 -0
- package/skills/create-post/SKILL.md +1308 -0
- package/skills/create-rubric/SKILL.md +251 -0
- package/skills/engage/SKILL.md +549 -0
- package/skills/engage/core/README.md +23 -0
- package/skills/engage/core/proven-searches.json +11 -0
- package/skills/engage/core/style-guide.template.md +47 -0
- package/skills/engage/core/tracked-people.json +10 -0
- package/skills/enrich-prospects/SKILL.md +97 -0
- package/skills/find-leads/SKILL.md +467 -0
- package/skills/generate-messages/SKILL.md +2361 -0
- package/skills/interview/SKILL.md +132 -0
- package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
- package/skills/interview/core/ICP.template.md +54 -0
- package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
- package/skills/providers/apollo.md +520 -0
- package/skills/providers/prospeo.md +398 -0
- package/skills/providers/sales-nav.md +372 -0
- package/skills/providers/signal-discovery.md +495 -0
- package/skills/research/SKILL.md +258 -0
- package/skills/research/config.json +9 -0
- package/skills/research/override.md +13 -0
- package/skills/research-prospect/SKILL.md +99 -0
- package/skills/research-sender/SKILL.md +158 -0
- 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.
|