@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,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?
|