@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,108 @@
1
+ # Offer Patterns
2
+
3
+ Use this file to teach the model why some offer structures outperform others.
4
+
5
+ ## Core Principle
6
+
7
+ An offer is the specific thing that makes the prospect reply. A strong offer is
8
+ easy to picture, low-friction relative to buyer intent, and tied to a real job
9
+ the buyer already cares about.
10
+
11
+ ## Low-Friction vs High-Friction
12
+
13
+ Low-friction offers usually work better earlier in the thread:
14
+
15
+ - send a short teardown
16
+ - send a one-page summary
17
+ - send a 2-minute walkthrough
18
+ - run one real artifact through the product and return the output
19
+
20
+ High-friction offers require more intent:
21
+
22
+ - book a 30-minute call
23
+ - join a full demo
24
+ - prepare materials before the first meeting
25
+ - commit multiple stakeholders before value is shown
26
+
27
+ ## Stronger vs Weaker Structures
28
+
29
+ Stronger:
30
+
31
+ - give something concrete before asking for time
32
+ - show exactly what comes back
33
+ - offer a lightweight path and a higher-commitment path
34
+ - tie the offer to the prospect's actual workflow or pain
35
+
36
+ Weaker:
37
+
38
+ - ask for time before the prospect sees value
39
+ - describe the offer in vague terms
40
+ - lead with a category pitch instead of a useful next step
41
+ - rely on artificial urgency without a real reason
42
+
43
+ ## Option A / Option B Pattern
44
+
45
+ Use this when both paths are clear and the prospect can self-select.
46
+
47
+ Pattern:
48
+
49
+ - Option A: passive or low-friction
50
+ - Option B: higher-commitment live walkthrough
51
+
52
+ Example shape:
53
+
54
+ - A) send us one real example and we send back a short summary
55
+ - B) if you want to see it live, we can run it together in 15 minutes
56
+
57
+ Why it works:
58
+
59
+ - captures early and late intent in the same message
60
+ - lowers reply friction
61
+ - avoids forcing every mildly interested prospect straight into a meeting ask
62
+
63
+ ## Galley Reference Case
64
+
65
+ The Galley audit is a canonical comparison for this repo.
66
+
67
+ Weaker path:
68
+
69
+ - prospect replies "sounds interesting"
70
+ - next step asks them to book time or do extra prep
71
+ - warm interest stalls
72
+
73
+ Stronger path:
74
+
75
+ - offer to run one real menu rotation through the system
76
+ - send back a one-page summary with mapped recipes, estimated margin gap, and unnecessary manual work
77
+ - keep the live walkthrough as the higher-commitment option B
78
+
79
+ Why the stronger version is better:
80
+
81
+ - the prospect understands what they get back
82
+ - the first value exchange does not depend on calendar commitment
83
+ - the follow-up becomes about their own output, not a generic demo request
84
+
85
+ ## Good vs Bad Offer Framing
86
+
87
+ Good:
88
+
89
+ - "we can run one of your menu rotations through our system and send back the recipes that map over, the estimated margin gap, and the manual work that did not need to exist"
90
+ - "happy to send a 2-minute walkthrough if that's easier, or we can do it live with your data"
91
+ - "we pulled one example and turned it into a concrete output you can react to"
92
+
93
+ Bad:
94
+
95
+ - "free audit"
96
+ - "free assessment"
97
+ - "framework review"
98
+ - "worth a quick call to walk through our process?"
99
+
100
+ ## When To Escalate The Ask
101
+
102
+ Escalate from send-something to take-time only when:
103
+
104
+ - the prospect explicitly asks to see more
105
+ - the proof or output has already created curiosity
106
+ - the thread indicates real buying intent
107
+
108
+ If the prospect has only shown mild interest, the next step should usually stay lightweight.
@@ -0,0 +1,212 @@
1
+ # Provider Selection Strategy
2
+
3
+ ## Core Philosophy: Active + ICP = Best Leads
4
+
5
+ The best leads are people who are:
6
+
7
+ 1. **Active on LinkedIn** (will actually see your message)
8
+ 2. **Fit your ICP** (right role, company, interests)
9
+
10
+ Only ~8% of a typical Apollo list is active on LinkedIn. That's why reply rates are so low with cold databases.
11
+
12
+ ## Provider Decision Hierarchy
13
+
14
+ ### 1. Signal Discovery (TRY FIRST)
15
+
16
+ Best leads because they're both active AND interested in your topics.
17
+
18
+ USE WHEN:
19
+
20
+ - ICP is LinkedIn-active: founders, GTM, sales, marketing, engineers, content creators
21
+ - There are posts about topics your ICP cares about
22
+ - You can realistically get hundreds of ICP-fit engagers from the posts
23
+
24
+ SKIP WHEN:
25
+
26
+ - Niche ICP that doesn't engage on LinkedIn (enterprise CTOs, procurement, etc.)
27
+ - Hard to find posts where your specific ICP engages
28
+ - Need very high volume (1000+ leads)
29
+
30
+ EXAMPLES:
31
+
32
+ - Founders -> "founder mode", "product market fit" posts = GREAT fit
33
+ - Engineers -> specific technology posts, open source discussions = GREAT fit
34
+ - Enterprise CTOs -> hard to find posts they engage with = SKIP, use Sales Nav
35
+
36
+ ### 2. Sales Navigator (DEFAULT WHEN SIGNAL DISCOVERY WON'T WORK)
37
+
38
+ With POSTED_ON_LINKEDIN filter = 4x higher reply rate than cold lists.
39
+
40
+ USE WHEN:
41
+
42
+ - Signal Discovery won't yield enough ICP-fit engagers
43
+ - Niche/enterprise ICP that doesn't engage publicly
44
+ - Account-based targeting (specific companies)
45
+ - Need active LinkedIn users but can't find via engagement
46
+
47
+ WHY: POSTED_ON_LINKEDIN ensures they're active on the platform.
48
+
49
+ Activity Filters (use one or both):
50
+
51
+ - **POSTED_ON_LINKEDIN** (id: RPOL) - Posted recently, 4x higher reply rates
52
+ - **RECENTLY_CHANGED_JOBS** (id: RPC) - Changed jobs recently, often in "buying mode"
53
+
54
+ Sales Nav works without these filters too -- just expect lower reply rates.
55
+
56
+ ### 3. Apollo (LAST RESORT FOR VOLUME)
57
+
58
+ Large database but leads may not be active on LinkedIn.
59
+
60
+ USE WHEN:
61
+
62
+ - Need technology stack filters (Salesforce users, React devs, etc.)
63
+ - Need very high volume and accept lower reply rates
64
+ - Other sources didn't work
65
+
66
+ CAVEAT: Only ~8% of Apollo leads actively use LinkedIn. Expect lower reply rates.
67
+
68
+ ## Quick Decision Flow
69
+
70
+ ```
71
+ Is your ICP LinkedIn-active (founders, sales, marketing, GTM, engineers)?
72
+ YES -> Can you find posts they'd engage with?
73
+ YES -> Signal Discovery (4x reply rates)
74
+ NO -> Sales Navigator + POSTED_ON_LINKEDIN (4x reply rates)
75
+ NO -> Sales Navigator (with or without POSTED_ON_LINKEDIN)
76
+
77
+ Need tech stack targeting? -> Apollo (has technology filters)
78
+ Have specific company names? -> Sales Navigator or Apollo with domains
79
+ ```
80
+
81
+ ## ICP-to-Provider Quick Reference
82
+
83
+ | ICP Type | Recommended | Why |
84
+ | ------------------------- | ---------------- | ---------------------------------------------------- |
85
+ | Founders, CEOs | Signal Discovery | Highly active on LinkedIn, lots of founder content |
86
+ | Sales/GTM leaders | Signal Discovery | Very active, tons of sales content |
87
+ | Marketing leaders | Signal Discovery | Active, lots of marketing content |
88
+ | Engineers/DevOps | Signal Discovery | Active on tech discussions, open source |
89
+ | Enterprise CTOs | Sales Navigator | Less public engagement, use POSTED_ON_LINKEDIN |
90
+ | Procurement/Ops | Sales Navigator | Rarely engage publicly |
91
+ | Few specific companies | Sales Navigator | Use CURRENT_COMPANY filter (lookup each company) |
92
+ | Company domain list (ABM) | Apollo | Has `q_organization_domains_list` for bulk targeting |
93
+ | Tech stack users | Apollo | Has technology filters |
94
+
95
+ **Default:** Try Signal Discovery first. Fall back to Sales Navigator if ICP is too niche.
96
+
97
+ ## ABM / Account-Based Targeting
98
+
99
+ When user has a list of target companies:
100
+
101
+ - **Few companies (< 20):** Use Sales Navigator with CURRENT_COMPANY filter
102
+
103
+ - Requires looking up each company individually
104
+ - Can combine with POSTED_ON_LINKEDIN for active users
105
+
106
+ - **Many companies (domain list):** Use Apollo with `q_organization_domains_list`
107
+ - Supports bulk domain upload (up to 190 per search)
108
+ - Example: `filters: { q_organization_domains_list: ["stripe.com", "notion.so", "figma.com"] }`
109
+ - Trade-off: No POSTED_ON_LINKEDIN equivalent, so reply rates may be lower
110
+
111
+ ## Recommendation Templates
112
+
113
+ Use these as starting points. The `{icp}` and `{topics}` placeholders come from campaign context.
114
+
115
+ **Signal Discovery (LinkedIn-active ICP):**
116
+
117
+ ```
118
+ Now let's find the right people to reach.
119
+
120
+ Since you're targeting **{icp}**, I'd recommend **Signal Discovery**.
121
+
122
+ Here's why:
123
+ - {icp} are very active on LinkedIn -- lots of posts about {topics}
124
+ - We can find people who recently engaged with content about {topics}
125
+ - These are warm leads: active on LinkedIn AND interested in your space
126
+ - 4x higher reply rates vs cold databases
127
+
128
+ Should I search for posts where {icp} are engaging?
129
+ ```
130
+
131
+ **Sales Navigator (niche/enterprise ICP):**
132
+
133
+ ```
134
+ Since you're targeting **{icp}**, I'd recommend **Sales Navigator** with the "Posted on LinkedIn" filter.
135
+
136
+ Here's why:
137
+ - {icp} don't publicly engage much on LinkedIn posts
138
+ - But with Sales Nav, we can filter for people who recently posted -- these are 4x more likely to reply
139
+ - Better than a cold database where only ~8% are actually active
140
+
141
+ Should I search for active {icp} on Sales Navigator?
142
+ ```
143
+
144
+ **Apollo (tech stack targeting):**
145
+
146
+ ```
147
+ Since you need to find **{icp}**, I'd recommend **Apollo**.
148
+
149
+ Here's why:
150
+ - Apollo has technology filters that other sources don't
151
+ - We can find people at companies using {techStack}
152
+ - Heads up: reply rates will be lower since not all leads are active on LinkedIn
153
+
154
+ Should I search Apollo for {techStack} users?
155
+ ```
156
+
157
+ **Apollo ABM (company domains):**
158
+
159
+ ```
160
+ Since you have a **list of target companies**, I'd recommend **Apollo** with domain targeting.
161
+
162
+ Here's why:
163
+ - Apollo supports bulk domain lists (up to 190 companies per search)
164
+ - We can find decision-makers at your exact target accounts
165
+ - Just share the domains (e.g., stripe.com, notion.so) and I'll find your ICP at those companies
166
+
167
+ Note: Reply rates may be lower than Signal Discovery or Sales Nav with POSTED_ON_LINKEDIN, since we can't filter for LinkedIn activity. Consider combining with a strong personalized message.
168
+
169
+ Can you share your target company domains?
170
+ ```
171
+
172
+ ## AskUserQuestion Construction Rules
173
+
174
+ Do not hardcode provider options. Build them from the framework:
175
+
176
+ 1. Compute the recommendation deterministically:
177
+ - If user already has a LinkedIn profile CSV on disk -> use `load_csv_linkedin_leads` to create or append to a lead list, then review before `confirm_lead_list`
178
+ - If user already has a company-domain CSV on disk -> use `load_csv_domains`, then continue with provider selection/search using the returned `domainFilterId`
179
+ - If user already has some other list shape that does not fit those CSV paths -> proceed with provider selection
180
+ - If the user specifies a provider or research plan -> treat that as a hard override
181
+ - Else if `providerPreference` override exists -> recommend that provider
182
+ - Else use the decision hierarchy above (Signal Discovery -> Sales Nav -> Apollo)
183
+ 2. Build options from `providerOrder` and `framework.providers[providerId].askOption`
184
+ 3. Mark the recommended option by appending " (Recommended)" if needed
185
+
186
+ **AskUserQuestion shape:**
187
+
188
+ ```json
189
+ {
190
+ "questions": [
191
+ {
192
+ "header": "Provider",
193
+ "question": "Which lead source would you like to use?",
194
+ "options": "[Construct from framework provider configs in providerOrder]",
195
+ "multiSelect": false
196
+ }
197
+ ]
198
+ }
199
+ ```
200
+
201
+ **labelToProviderId map:**
202
+
203
+ When building options, store a `labelToProviderId` map. After user selects, resolve `providerId` from that map (not guesswork). If missing, fall back to the first valid provider in `providerOrder`.
204
+
205
+ **User-directed research plan (skip recommendation when present):**
206
+
207
+ If the user gives specific research instructions (provider order, filters, target accounts, tech stack, exclusions):
208
+
209
+ 1. Summarize their plan in 1-3 bullets
210
+ 2. Treat it as the active override
211
+ 3. Choose the provider that best matches their instructions
212
+ 4. Proceed without re-recommending a different provider
@@ -0,0 +1,167 @@
1
+ # AskUserQuestion Examples
2
+
3
+ JSON shapes for AskUserQuestion calls throughout the campaign creation flow. Use these as templates -- replace `{placeholders}` with actual values.
4
+
5
+ ## Phase 1 Step 2: Confirm Company & Authorize Research
6
+
7
+ ```json
8
+ {
9
+ "questions": [
10
+ {
11
+ "header": "Research",
12
+ "question": "I found you at {company} ({companyDomain}). Should I research this company for credibility, case studies, and proof?",
13
+ "options": [
14
+ {
15
+ "label": "Yes, research this",
16
+ "description": "Research {companyDomain} for the campaign"
17
+ },
18
+ {
19
+ "label": "Different company",
20
+ "description": "I'll share another domain"
21
+ }
22
+ ],
23
+ "multiSelect": false
24
+ }
25
+ ]
26
+ }
27
+ ```
28
+
29
+ ## Phase 2: Campaign Scope
30
+
31
+ ```json
32
+ {
33
+ "questions": [
34
+ {
35
+ "header": "Campaign Scope",
36
+ "question": "Do you have your own idea, or should I go ahead and draft a campaign for {companyDomain}?",
37
+ "options": [
38
+ {
39
+ "label": "Draft one for me",
40
+ "description": "Use what you found for {companyDomain}"
41
+ },
42
+ {
43
+ "label": "I have an idea",
44
+ "description": "I'll share the target + angle"
45
+ },
46
+ {
47
+ "label": "Different company/offer",
48
+ "description": "This isn't for {companyDomain}"
49
+ }
50
+ ],
51
+ "multiSelect": false
52
+ }
53
+ ]
54
+ }
55
+ ```
56
+
57
+ ## Phase 4 Step 3: Execution Mode
58
+
59
+ Preface text (show before options):
60
+
61
+ ```
62
+ Before we start lead sourcing, choose how hands-on you want me to be.
63
+ This setting controls how often I pause for confirmation:
64
+ - Continue step by step: I ask before each major action.
65
+ - Use best judgment: I run autonomously and pause only when required.
66
+ - Ask when needed: I move quickly and check in at branch decisions.
67
+ ```
68
+
69
+ ```json
70
+ {
71
+ "questions": [
72
+ {
73
+ "header": "Execution Mode",
74
+ "question": "Before we start lead sourcing, which interaction mode do you want?",
75
+ "options": [
76
+ {
77
+ "label": "Continue step by step (Recommended)",
78
+ "description": "Most control: I pause for approval before each major action"
79
+ },
80
+ {
81
+ "label": "Use best judgment",
82
+ "description": "Fastest: I run autonomously and pause only when required"
83
+ },
84
+ {
85
+ "label": "Ask when needed",
86
+ "description": "Balanced: I move fast and check in for branch decisions"
87
+ }
88
+ ],
89
+ "multiSelect": false
90
+ }
91
+ ]
92
+ }
93
+ ```
94
+
95
+ Store `interactionMode`:
96
+
97
+ - "Continue step by step" -> `step-by-step`
98
+ - "Use best judgment" -> `autonomous`
99
+ - "Ask when needed" -> `ask-when-needed`
100
+ - If ambiguous, default to `ask-when-needed`
101
+
102
+ ## Phase 5: Provider Selection
103
+
104
+ Build dynamically from framework -- see `references/provider-selection-strategy.md` for construction rules.
105
+
106
+ ```json
107
+ {
108
+ "questions": [
109
+ {
110
+ "header": "Provider",
111
+ "question": "Which lead source would you like to use?",
112
+ "options": "[Construct from framework provider configs in providerOrder]",
113
+ "multiSelect": false
114
+ }
115
+ ]
116
+ }
117
+ ```
118
+
119
+ ## Phase 5: Lead List Mode (existing list detected)
120
+
121
+ Only shown when `import_leads` returns `needsModeSelection: true`.
122
+
123
+ ```json
124
+ {
125
+ "questions": [
126
+ {
127
+ "header": "Lead List",
128
+ "question": "A lead list already exists with {existingCount} leads. Should I add to it or replace it?",
129
+ "options": [
130
+ {
131
+ "label": "Add to existing",
132
+ "description": "Append new leads to the current list"
133
+ },
134
+ {
135
+ "label": "Replace",
136
+ "description": "Archive existing leads and import fresh"
137
+ }
138
+ ],
139
+ "multiSelect": false
140
+ }
141
+ ]
142
+ }
143
+ ```
144
+
145
+ ## Phase 5: Filter Recommendation
146
+
147
+ After sampling leads, recommend one of: Add filters / Skip filters / Refine list first.
148
+
149
+ Format:
150
+
151
+ ```
152
+ [X] leads imported into the campaign table.
153
+
154
+ I moved you to the Enable Filtering step.
155
+ You should see the yes/no choice for ICP filtering.
156
+
157
+ Recommendation: [Add filters / Skip filters / Refine list first]
158
+ - Why: [1-2 concrete reasons tied to the lead sample + ICP]
159
+
160
+ Choose whether to add ICP filters (rubric) or skip filtering, and I'll continue.
161
+ ```
162
+
163
+ Guardrails:
164
+
165
+ - If list is small (under ~150) or ICP is already narrow, warn that filters may leave too few leads.
166
+ - If user asked for exclusions (competitors, geo, tech stack, ARR), call that out as a reason to filter.
167
+ - Keep to 2-4 sentences; be candid about quality.
@@ -0,0 +1,81 @@
1
+ # Token Fill Examples
2
+
3
+ Use this file when template-style personalization is in play.
4
+
5
+ ## Good Token Fill
6
+
7
+ Good token fill feels like a human wrote the sentence after seeing the
8
+ prospect's context.
9
+
10
+ Examples:
11
+
12
+ - Good: "saw you're hiring AE talent after opening the Austin office"
13
+ - Good: "noticed your team has been talking more openly about runtime exposure"
14
+ - Good: "looks like you're still growing through founder-led content"
15
+
16
+ Why these work:
17
+
18
+ - specific enough to feel grounded
19
+ - short enough to read naturally
20
+ - integrated into the sentence instead of pasted on top
21
+
22
+ ## Bad Token Fill
23
+
24
+ Bad token fill sounds mechanical, creepy, or vague.
25
+
26
+ Examples:
27
+
28
+ - Bad: "noticed that at {{company}} you are focused on business growth"
29
+ - Bad: "I saw your impressive background in leadership and innovation"
30
+ - Bad: "after reviewing your LinkedIn profile in detail..."
31
+ - Bad: "congrats on all the momentum at {{company}}"
32
+
33
+ Why these fail:
34
+
35
+ - generic enough to fit almost anyone
36
+ - sound over-researched or synthetic
37
+ - add no real relevance
38
+
39
+ ## Interpolation Guardrails
40
+
41
+ - Do not force every token into every message.
42
+ - If the token does not make the sentence stronger, omit it.
43
+ - Prefer one sharp personalized detail over three weak ones.
44
+ - Avoid praise-heavy interpolation unless there is a real reason to praise.
45
+ - Do not use stale or doubtful facts just because they were available in context.
46
+
47
+ ## Smooth vs Awkward
48
+
49
+ Smooth:
50
+
51
+ - "not sure if this is relevant but it looks like you're pushing into enterprise accounts now"
52
+ - "saw the post on AI exposure and thought this might actually be relevant"
53
+
54
+ Awkward:
55
+
56
+ - "not sure if this is relevant but according to your recent post you are pushing into enterprise accounts"
57
+ - "I saw on LinkedIn that you recently posted about AI exposure and therefore wanted to contact you"
58
+
59
+ ## Persona-Specific Notes
60
+
61
+ Gelee / founder targeting:
62
+
63
+ - use life-stage or operator context only when it changes the offer
64
+ - avoid overpersonalized founder flattery
65
+
66
+ Superposition / founder-story positioning:
67
+
68
+ - keep named proof or founder story tight
69
+ - do not turn the sender story into a monologue
70
+
71
+ Revvix / security positioning:
72
+
73
+ - favor concrete category language over hype
74
+ - technical credibility should feel matter-of-fact, not theatrical
75
+
76
+ ## Red Flags
77
+
78
+ - the token reads like CRM metadata
79
+ - the token makes the sentence longer without making it better
80
+ - the token sounds like a compliment sandwich
81
+ - the token could be swapped into any message without changing meaning
@@ -0,0 +1,72 @@
1
+ # Create Campaign Brief Architecture
2
+
3
+ Phase 83 is a prompt and artifact workflow, not a database write path.
4
+
5
+ ## Boundary
6
+
7
+ `create-campaign-brief` creates one `brief.md v1` and stops. Phase 84 validates
8
+ the brief and creates rubric assets. Phase 85 mints or executes a campaign.
9
+
10
+ The command must not call campaign creation, campaign update, lead import,
11
+ rubric write, or workflow table write tools.
12
+
13
+ ## Prompt Layers
14
+
15
+ ### Orchestrator
16
+
17
+ - `SKILL.md`
18
+
19
+ Defines the command, phase boundary, forbidden actions, and seven-step flow.
20
+
21
+ ### Step References
22
+
23
+ - `references/quick-research-protocol.md`
24
+ - `references/campaign-idea-options.md`
25
+ - `references/icp-lock-question-bank.md`
26
+ - `references/reference-sheet-protocol.md`
27
+ - `references/messaging-inputs.md`
28
+ - `references/draft-lifecycle.md`
29
+
30
+ These keep the prompt loadable in smaller pieces.
31
+
32
+ ### Output Contract
33
+
34
+ - `references/brief-template.md`
35
+
36
+ Defines `brief.md v1`, customer-facing source bibliography, concise product
37
+ bullets, tokenized copy sections, token fill rules, and the simple next-step
38
+ flow: find leads, tighten filter, then draft message.
39
+
40
+ ### Reference Bank
41
+
42
+ - `references/examples/MANIFEST.json`
43
+ - `references/examples/briefs/*.md`
44
+
45
+ The manifest indexes client, campaign mode, file path, and holdout behavior.
46
+ The actual gold-standard brief template and runtime instructions come from
47
+ Phase 75:
48
+
49
+ - `references/phase75-canonical-brief-template.md`
50
+ - `references/phase75-active-runtime-message-pack.md`
51
+ - `references/phase75-good-brief-and-messaging-examples.md`
52
+
53
+ ### UAT
54
+
55
+ - `scripts/run-create-campaign-brief-vps-uat.sh`
56
+ - `scripts/mcp/sellable-create-campaign-brief-rehearsal.mjs`
57
+ - `.planning/artifacts/uat/83-create-campaign-brief/`
58
+
59
+ Hosted UAT runs on `sellable-web-mcp` with real Claude Code stream-json output
60
+ and records stream, summary, tool calls, generated brief, score, and notes.
61
+
62
+ ## Design Rules
63
+
64
+ - Markdown-first.
65
+ - Evidence-first.
66
+ - Ask only blocking questions.
67
+ - Reference briefs are explicit and swappable in operator/runtime context.
68
+ - Internal references never appear in customer-facing brief sections.
69
+ - Withhold a fixture customer's own references during holdout runs.
70
+ - Messaging stays high-level, and the brief explains the next-step order as:
71
+ find leads, tighten filter, then draft message.
72
+ - Token rules are part of the brief, not a later copy-generation guess.
@@ -0,0 +1,64 @@
1
+ # Create Campaign Brief - Design Discussion
2
+
3
+ Purpose: lock the contract for the standalone brief command before it is merged
4
+ into other flows.
5
+
6
+ ## 1) What the user runs
7
+
8
+ The logical command is:
9
+
10
+ - `create-campaign-brief`
11
+
12
+ It is the standalone proving surface for brief quality.
13
+
14
+ ## 2) Why it is separate from create-campaign
15
+
16
+ Because brief quality is easier to tune when the command only has to do one
17
+ thing well:
18
+
19
+ - consume a source bundle
20
+ - produce a client-ready brief
21
+ - optionally emit a bounded appendix
22
+
23
+ This avoids mixing brief quality with provider selection, lead import, or UI
24
+ state transitions.
25
+
26
+ ## 3) Output boundary
27
+
28
+ Main brief:
29
+
30
+ - client-facing
31
+ - strategy-first
32
+ - no giant copy dump
33
+
34
+ Bounded appendix:
35
+
36
+ - message directions
37
+ - opener and CTA guidance
38
+ - token-fill examples
39
+ - anti-pattern reminders
40
+
41
+ ## 4) Acceptance bar
42
+
43
+ The brief should be good enough zero-shot that:
44
+
45
+ - the client feels understood
46
+ - the operator does not need to rewrite the whole thing
47
+ - downstream message drafting has clear, stable guardrails
48
+
49
+ Amplify Security is the first named acceptance case, not the only one.
50
+
51
+ ## 5) What should not happen here
52
+
53
+ - no campaign creation
54
+ - no provider routing
55
+ - no hidden dependence on the old 10-section builder schema
56
+ - no invented proof
57
+
58
+ ## 6) Open questions
59
+
60
+ - Should the command stay internal until the acceptance harness is stronger?
61
+ - Should the bounded appendix be persisted inside `campaignBrief.content` or as
62
+ a separate artifact later?
63
+ - Which parts of the command should become MCP tools vs remain prompt-layer
64
+ logic?