@sellable/mcp 0.1.203 → 0.1.205

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 (33) hide show
  1. package/README.md +7 -7
  2. package/agents/post-find-leads-message-scout.md +16 -4
  3. package/dist/engage-memory.js +0 -5
  4. package/dist/identity-memory.js +0 -4
  5. package/dist/tools/engage-memory.js +2 -2
  6. package/dist/tools/prompts.js +3 -2
  7. package/package.json +1 -1
  8. package/skills/create-campaign/context/learnings.md +1 -1
  9. package/skills/create-campaign/references/brief-template.md +2 -2
  10. package/skills/create-campaign-brief/references/brief-template.md +2 -2
  11. package/skills/create-campaign-brief/references/draft-lifecycle.md +1 -1
  12. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +2 -2
  13. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +41 -28
  14. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +12 -9
  15. package/skills/create-campaign-v2/references/ai-tells.md +35 -10
  16. package/skills/create-campaign-v2/references/approval-gate-framing.md +1 -1
  17. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +30 -16
  18. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +1 -1
  19. package/skills/create-campaign-v2/references/gold-standard-runtime-message-pack.md +252 -0
  20. package/skills/create-campaign-v2/references/thomas-revision-filters.md +12 -3
  21. package/skills/create-campaign-v2/references/validation-criteria.md +8 -5
  22. package/skills/create-campaign-v2-validation/SKILL.md +1 -1
  23. package/skills/create-post/SKILL.md +27 -27
  24. package/skills/engage/SKILL.md +12 -12
  25. package/skills/engage/core/README.md +14 -14
  26. package/skills/find-leads/SKILL.md +1 -1
  27. package/skills/generate-messages/SKILL.md +171 -71
  28. package/skills/interview/SKILL.md +24 -24
  29. package/skills/interview/references/legacy-linkedin-interview.md +12 -12
  30. package/skills/interview/references/reference-curation.md +4 -4
  31. package/skills/interview/references/voice-capture-method.md +1 -1
  32. package/skills/load-voice/SKILL.md +21 -25
  33. package/skills/research/SKILL.md +1 -1
package/README.md CHANGED
@@ -345,12 +345,12 @@ with outcomes, and tracked people (LinkedIn profiles), all scoped by workspace.
345
345
 
346
346
  - Auth + active workspace: `~/.sellable/config.json` (or `SELLABLE_CONFIG_PATH`; old `$CODEX_HOME/sellable.json`, `~/.codex/sellable.json`, and `~/.claude/sellable.json` files remain compatibility fallbacks)
347
347
  - Engage memory (style guide + searches + tracked people): `sellable.engage.json` (or `SELLABLE_ENGAGE_MEMORY_PATH`)
348
- - Team-editable, project-local configs (recommended to edit in git):
349
- - `./.sellable/configs/writing/styleguide.md`
350
- - `./.sellable/configs/audience/icp-filters.md`
351
- - `./.sellable/configs/proof/claims.md`
352
- - `./.sellable/configs/discovery/influencers.md`
353
- - `./.sellable/configs/discovery/post-filters.md`
348
+ - Team-editable durable configs (home-level source of truth):
349
+ - `~/.sellable/configs/writing/styleguide.md`
350
+ - `~/.sellable/configs/audience/icp-filters.md`
351
+ - `~/.sellable/configs/proof/claims.md`
352
+ - `~/.sellable/configs/discovery/influencers.md`
353
+ - `~/.sellable/configs/discovery/post-filters.md`
354
354
 
355
355
  Files under `mcp/sellable/skills/**/core/*` are **package repo files**, not the intended user config surface.
356
356
 
@@ -363,7 +363,7 @@ Primary public entrypoint for the approval-gated campaign creation flow.
363
363
  ### interview
364
364
 
365
365
  Public identity/company memory interview. Builds durable core files under
366
- `./.sellable/configs/core/**`, raw archives under `./.sellable/interviews/**`,
366
+ `~/.sellable/configs/core/**`, raw archives under `~/.sellable/interviews/**`,
367
367
  and reusable answer/proof/story/transcript/reference memory for downstream
368
368
  Sellable writing workflows.
369
369
 
@@ -44,9 +44,15 @@ the branch input.
44
44
  2. Use that prompt as the drafting contract. Do not use any alternate prompt,
45
45
  examples-only shortcut, or create-campaign safety/checklist instructions as a
46
46
  substitute for the full message prompt.
47
- 3. Draft only from the campaign brief, selected source context, and initial
47
+ 3. Follow the prompt's `Reference Asset Loading` section: load the required
48
+ pre-draft reference pack before drafting, load final-pass references before
49
+ approval, and report which assets were used and why. If those required
50
+ assets cannot be loaded, return `blocked` / `retry-needed`; do not draft from
51
+ the prompt alone. `ai-tells.md` is part of the required pack and is never
52
+ optional.
53
+ 4. Draft only from the campaign brief, selected source context, and initial
48
54
  campaign-table execution slice rows supplied by the parent.
49
- 4. Keep the work provisional until the user chooses `Use Template` in Messages.
55
+ 5. Keep the work provisional until the user chooses `Use Template` in Messages.
50
56
 
51
57
  ## Owned Output
52
58
 
@@ -54,6 +60,8 @@ Return the following to the parent thread:
54
60
 
55
61
  - proposed first-message template using supported `{{...}}` tokens
56
62
  - token fill rules and fallbacks
63
+ - `Reference Asset Loading` note naming the required and conditional assets used
64
+ and why each was used
57
65
  - one rendered good-fill sample for a plausible passing campaign-table row
58
66
  - one omit/fallback sample when the row signal is not safe
59
67
  - pass/fail notes against the generate-messages quality gates
@@ -125,10 +133,14 @@ reacted to`, `saw you engaging with`, or equivalent source-citation copy as a
125
133
  hope this is relevant`, `saw you in a few conversations about [topic], so
126
134
  may be off, but this seemed relevant`, `saw you might be interested in [topic],
127
135
  so hope this is relevant`, `hope this is relevant if [topic] is on your plate`,
128
- or `saw you raise your hand for [topic], so figured this was (hopefully) worth sending`.
136
+ or `found you in a thread about [topic], so may be off, but this seemed relevant`.
137
+ Only use `saw you raise your hand for [topic], so figured this was (hopefully)
138
+ worth sending` when the source was an explicit lead-magnet comment, reply, or
139
+ opt-in.
129
140
  The cheekier `saw you raise your hand for [topic] (creepy to reach out based
130
141
  on that, i know) - but this felt too on the nose to ignore` version is also
131
- allowed when the sender's voice can carry it. Bad: `you commented on...`, `you reacted
142
+ allowed only for explicit lead-magnet comments, replies, or opt-ins and when the
143
+ sender's voice can carry it. Bad: `you commented on...`, `you reacted
132
144
  to...`, `saw you engaging with...`, `your LinkedIn activity...`, `you might
133
145
  not remember the thread...`, or `found you through [source] and your role
134
146
  looked close...`. Otherwise omit the engagement signal and use role/company/problem context.
@@ -8,11 +8,6 @@ function resolveConfigsDir() {
8
8
  if (process.env.SELLABLE_CONFIGS_DIR) {
9
9
  candidates.push(path.resolve(process.env.SELLABLE_CONFIGS_DIR));
10
10
  }
11
- // Same resolution strategy as skills.ts
12
- if (process.argv[1]) {
13
- candidates.push(path.resolve(path.dirname(process.argv[1]), "../../.sellable/configs"));
14
- }
15
- candidates.push(path.resolve(process.cwd(), ".sellable/configs"));
16
11
  candidates.push(path.resolve(os.homedir(), ".sellable/configs"));
17
12
  for (const candidate of candidates) {
18
13
  if (fs.existsSync(candidate)) {
@@ -20,10 +20,6 @@ export function resolveIdentityConfigsDir() {
20
20
  if (process.env.SELLABLE_CONFIGS_DIR) {
21
21
  candidates.push(path.resolve(process.env.SELLABLE_CONFIGS_DIR));
22
22
  }
23
- if (process.argv[1]) {
24
- candidates.push(path.resolve(path.dirname(process.argv[1]), "../../.sellable/configs"));
25
- }
26
- candidates.push(path.resolve(process.cwd(), ".sellable/configs"));
27
23
  candidates.push(path.resolve(os.homedir(), ".sellable/configs"));
28
24
  for (const candidate of candidates) {
29
25
  if (fs.existsSync(candidate)) {
@@ -2,7 +2,7 @@ import { copySenderConfig, getEngageMemory, migrateFlatConfigs, recordProvenSear
2
2
  export const engageMemoryToolDefinitions = [
3
3
  {
4
4
  name: "get_engage_memory",
5
- description: "Load backward-compatible engage memory from .sellable/configs/: style guide, proven search keywords, tracked people, plus optional core identity/company memory. All data lives in readable markdown files the user can also edit directly. When senderId is provided, reads compatibility overrides from senders/{senderId}/ with flat-path fallback.",
5
+ description: "Load backward-compatible engage memory from ~/.sellable/configs/: style guide, proven search keywords, tracked people, plus optional core identity/company memory. All data lives in readable markdown files the user can also edit directly. When senderId is provided, reads compatibility overrides from senders/{senderId}/ with flat-path fallback.",
6
6
  inputSchema: {
7
7
  type: "object",
8
8
  properties: {
@@ -17,7 +17,7 @@ export const engageMemoryToolDefinitions = [
17
17
  },
18
18
  {
19
19
  name: "set_engage_style_guide",
20
- description: "Write the user's commenting style guide. When senderId is provided, writes to .sellable/configs/senders/{senderId}/styleguide-core.md. Otherwise writes to .sellable/configs/writing/styleguide-core.md.",
20
+ description: "Write the user's commenting style guide. When senderId is provided, writes to ~/.sellable/configs/senders/{senderId}/styleguide-core.md. Otherwise writes to ~/.sellable/configs/writing/styleguide-core.md.",
21
21
  inputSchema: {
22
22
  type: "object",
23
23
  properties: {
@@ -330,7 +330,7 @@ export function getPostFindLeadsScoutRegistry() {
330
330
  "basis.workflowTableId",
331
331
  "basis.reviewSampleRowHash or basis.reviewSampleRowIds",
332
332
  ],
333
- promptRequired: 'get_subskill_prompt({ subskillName: "generate-messages" }); the full generate-messages prompt is required for normal message drafting',
333
+ promptRequired: 'get_subskill_prompt({ subskillName: "generate-messages" }); the full generate-messages prompt is required for normal message drafting, then follow its Reference Asset Loading step and load the required pre-draft reference pack before drafting. ai-tells.md is required and never optional. If the required assets cannot be loaded, return blocked/retry-needed instead of drafting from the prompt alone.',
334
334
  basisFields: [
335
335
  "campaign revision or updatedAt",
336
336
  "brief hash",
@@ -343,6 +343,7 @@ export function getPostFindLeadsScoutRegistry() {
343
343
  messageDraftOutputFields: [
344
344
  "templateRecommendation",
345
345
  "tokenFillRules",
346
+ "referenceAssetLoading",
346
347
  "renderedSample",
347
348
  "concerns",
348
349
  "status",
@@ -357,7 +358,7 @@ export function getPostFindLeadsScoutRegistry() {
357
358
  usage: {
358
359
  codex: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not spawn returned post-lead scout names before that question. Once the user answers, spawn Message Draft Builder from the same campaign/table basis. If the user chooses filters, also spawn Lead Fit Builder, move to Filter Rules, save rubrics, ask for filter approval, then keep the browser on Filter Leads and show `Filters saved + waiting for message approval` while the message recommendation is reviewed. If filters are skipped, move to Messages/message review.",
359
360
  claude: "After confirm_lead_list copies source rows and the initial campaign-table execution slice exists, ask the filter-choice question immediately. Do not invoke returned post-lead Task/Agent names before that question. Once the user answers, invoke Message Draft Builder from the same campaign/table basis. If the user chooses filters, also invoke Lead Fit Builder, move to Filter Rules, save rubrics, ask for filter approval, then keep the browser on Filter Leads and show `Filters saved + waiting for message approval` while the message recommendation is reviewed. If filters are skipped, move to Messages/message review.",
360
- parentThreadRule: 'Named agents are optional acceleration, but message drafting is not optional. If post-find-leads-message-scout is available, run it as the background Message Draft Builder after the filter-choice answer. If it is absent, do not customer-surface install status; the main thread must execute the same message branch from CampaignOffer state, selected source state, workflowTableId, and initial campaign-table execution slice rows. Local markdown/json files are not normal-path inputs. The filter-choice question is the first post-import user gate; do not load post-lead registries or filter references before it. Message drafting starts after the filter-choice answer, must load get_subskill_prompt({ subskillName: "generate-messages" }), must read live campaign table state through scoped MCP/product tools, and must reject mismatched selectedLeadListId/workflowTableId/campaign/workspace input. Do not use any alternate or examples-only message prompt. On the filter path, keep the browser on Filter Rules after save_rubrics so the user can approve the saved criteria; only then move to Filter Leads, show `Filters saved + waiting for message approval`, and wait there for message approval. Enrichment, filtering, Generate Message cells, sender setup, sequence attach, and launch wait for template approval on the Use Template path. On the skip path, move to Messages/message review and wait for message approval before enrichment or Settings. Do not render message review from checklist or shortcut instructions; message review requires a messageDraftRecommendation whose basis proves the generate-messages prompt ran for the current campaign/table execution slice. Do not automatically rerun Message Draft Builder after filters/enrichment finish; show the initial draft by default and offer an enriched rewrite only with explicit user opt-in.',
361
+ parentThreadRule: 'Named agents are optional acceleration, but message drafting is not optional. If post-find-leads-message-scout is available, run it as the background Message Draft Builder after the filter-choice answer. If it is absent, do not customer-surface install status; the main thread must execute the same message branch from CampaignOffer state, selected source state, workflowTableId, and initial campaign-table execution slice rows. Local markdown/json files are not normal-path inputs. The filter-choice question is the first post-import user gate; do not load post-lead registries or filter references before it. Message drafting starts after the filter-choice answer, must load get_subskill_prompt({ subskillName: "generate-messages" }), must follow Reference Asset Loading and load the required pre-draft reference pack before drafting, must include ai-tells.md because it is never optional, must return blocked/retry-needed if required assets cannot be loaded, must read live campaign table state through scoped MCP/product tools, and must reject mismatched selectedLeadListId/workflowTableId/campaign/workspace input. Do not use any alternate or examples-only message prompt. On the filter path, keep the browser on Filter Rules after save_rubrics so the user can approve the saved criteria; only then move to Filter Leads, show `Filters saved + waiting for message approval`, and wait there for message approval. Enrichment, filtering, Generate Message cells, sender setup, sequence attach, and launch wait for template approval on the Use Template path. On the skip path, move to Messages/message review and wait for message approval before enrichment or Settings. Do not render message review from checklist or shortcut instructions; message review requires a messageDraftRecommendation whose basis proves the generate-messages prompt ran for the current campaign/table execution slice. Do not automatically rerun Message Draft Builder after filters/enrichment finish; show the initial draft by default and offer an enriched rewrite only with explicit user opt-in.',
361
362
  },
362
363
  };
363
364
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.203",
3
+ "version": "0.1.205",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -4,7 +4,7 @@ This log captures what has worked in real campaigns.
4
4
 
5
5
  Entries should be short, specific, and based on observed outcomes.
6
6
 
7
- **Cross-skill learnings** that would help other skills (engage, create-post) should ALSO be written to `.sellable/insights/cross-skill.md` so the entire system learns.
7
+ **Cross-skill learnings** that would help other skills (engage, create-post) should ALSO be written to `~/.sellable/insights/cross-skill.md` so the entire system learns.
8
8
 
9
9
  ## Log
10
10
 
@@ -41,8 +41,8 @@ Example: "In a 15-minute call, we will audit your top 10 accounts and show where
41
41
  - **Bridge to:** [How it connects to their pain]
42
42
  - **Avoid:** [Generic phrases to skip - "best-in-class", "industry-leading", etc.]
43
43
  - **Voice:** [Reference core memory / composed engage memory first. Use legacy writing memory only as fallback.]
44
- - **Outbound rules:** [Reference `.sellable/configs/writing/outbound.md` if loaded -- observation -> relevance -> ask]
45
- - **Proof boundaries:** [Reference `.sellable/configs/core/proof-ledger.md` and `.sellable/configs/core/wins-ledger.md` if loaded. Do not upgrade or invent claims.]
44
+ - **Outbound rules:** [Reference `~/.sellable/configs/writing/outbound.md` if loaded -- observation -> relevance -> ask]
45
+ - **Proof boundaries:** [Reference `~/.sellable/configs/core/proof-ledger.md` and `~/.sellable/configs/core/wins-ledger.md` if loaded. Do not upgrade or invent claims.]
46
46
 
47
47
  ## Do NOT Target
48
48
 
@@ -15,7 +15,7 @@ assistant message directly from the `result.result` stream-json payload —
15
15
  it does not read a file off disk.
16
16
 
17
17
  If you find yourself emitting a TodoWrite step like "Write brief.md v1
18
- to disk" or "Save brief to .sellable/..." — DELETE that step and return
18
+ to disk" or "Save brief to ~/.sellable/..." — DELETE that step and return
19
19
  the brief inline instead. The tools `Write`, `Edit`, and `Bash` are
20
20
  intentionally not in the Phase 83 harness allowlist; attempting them
21
21
  will cause a ToolSearch loop that deadlocks the turn.
@@ -37,7 +37,7 @@ offer is, why it should work, and what must be true before we launch. Do not
37
37
  prescribe message structure, opener order, or final copy here.]
38
38
 
39
39
  Draft path:
40
- `.sellable/create-campaign-brief/drafts/{workspace-slug}/{campaign-slug}/brief.md`
40
+ `~/.sellable/create-campaign-brief/drafts/{workspace-slug}/{campaign-slug}/brief.md`
41
41
 
42
42
  ## Product
43
43
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Phase 83 writes one Markdown file:
4
4
 
5
- `.sellable/create-campaign-brief/drafts/{workspace-slug}/{campaign-slug}/brief.md`
5
+ `~/.sellable/create-campaign-brief/drafts/{workspace-slug}/{campaign-slug}/brief.md`
6
6
 
7
7
  ## Rules
8
8
 
@@ -58,7 +58,7 @@ _Personalization: References their previous exit or current venture by name + th
58
58
 
59
59
  Hi {{first_name}}, let me know if i'm off, but {{seems_like_you}}.
60
60
 
61
- saw you were active in some {{signal_topic}} conversations recently and figured this might be relevant.
61
+ saw you in a few conversations around {{signal_topic}}, so hope this is relevant.
62
62
 
63
63
  we work with about 30 exited founders right now (yc, techstars, sequoia backed) handling their entire linkedin with ai + human review.
64
64
 
@@ -131,7 +131,7 @@ is this worth a look or should i send a short overview?
131
131
 
132
132
  Hi sarah, let me know if i'm off, but seems like you started building something new in the pharma space after the Benchling exit.
133
133
 
134
- saw you were active in some founder-led growth conversations recently and figured this might be relevant.
134
+ saw you in a few conversations around founder-led growth, so hope this is relevant.
135
135
 
136
136
  we work with about 30 exited founders right now (yc, techstars, sequoia backed) handling their entire linkedin with ai + human review.
137
137
 
@@ -35,70 +35,82 @@ Signal-based outreach using peer-to-peer tone. Positioning Superpower as early d
35
35
 
36
36
  **VARIANT 1 — Subject: jeff/{{first name}} intro**
37
37
 
38
- hey {{first name}}, saw you were active around some {{topic}} stuff recently and figured this might actually be relevant
38
+ hey {{first name}},
39
39
 
40
- any chance you're exploring early detection or preventive health programs at {{company}}?
40
+ saw you in a few conversations around {{topic}}, so hope this is relevant.
41
41
 
42
- we screen for 1,000+ conditions from a single blood draw and surface risks before they ever become claims.
42
+ if preventive health is anywhere near the benefits plan at {{company}}, Superpower may be worth a look.
43
43
 
44
- basically your team gets to see what's coming instead of just reacting to it
44
+ it screens for 1,000+ conditions from a single blood draw and surfaces risks before they become claims.
45
45
 
46
- can I send over some more info?
46
+ basically your team gets to see what's coming instead of only reacting to it.
47
+
48
+ should i send over the short version?
47
49
 
48
50
  **VARIANT 2 — Subject: jeff/{{first name}} intro**
49
51
 
50
- hey {{first name}}. saw you were active in some {{topic}} conversations recently and wanted to run something by you
52
+ hey {{first name}},
53
+
54
+ saw you in a few conversations around {{topic}}, so hope this is relevant.
51
55
 
52
56
  most annual physicals test 15 biomarkers max.
53
57
 
54
- there's over 100 that actually matter and the gap between those two numbers is where the expensive claims tend to sit
58
+ Superpower looks at 100+ biomarkers and screens for 1,000+ conditions from one draw.
55
59
 
56
- teams like Lyft and Notion are already exploring this. one draw, 1,000+ conditions, $199 a person.
60
+ teams like Lyft and Notion are already exploring this at $199 a person.
57
61
 
58
- if your claims costs have been going up and you're not sure where it's coming from... that gap may be a good place to start looking
62
+ if preventive health is nowhere near your lane, ignore me.
59
63
 
60
- can I send over some more info?
64
+ should i send over the short version?
61
65
 
62
66
  ## Examples
63
67
 
64
68
  **Example 1 (Variant 1 — self-insured health plans):**
65
69
  Subject: susana/prab intro
66
70
 
67
- hey susana, saw you were active around self-insured health plan content recently and figured this might actually be relevant
71
+ hey susana,
72
+
73
+ saw you in a few conversations around self-insured health plans, so hope this is relevant.
68
74
 
69
- any chance you're exploring preventive health programs at Quantum Health?
75
+ if preventive health is anywhere near the benefits plan at Quantum Health, Superpower may be worth a look.
70
76
 
71
- we screen for 1,000+ conditions from a single blood draw and surface risks before they ever become claims.
77
+ it screens for 1,000+ conditions from a single blood draw and surfaces risks before they become claims.
72
78
 
73
- basically your team gets to see what's coming instead of just reacting to it
79
+ basically your team gets to see what's coming instead of only reacting to it.
74
80
 
75
- can I send over some more info?
81
+ should i send over the short version?
76
82
 
77
83
  **Example 2 (Variant 2 — employee wellness programs):**
78
84
  Subject: lisa/prab intro
79
85
 
80
- hey lisa. saw you were active in some employee wellness programs conversations recently and wanted to run something by you
86
+ hey lisa,
87
+
88
+ saw you in a few conversations around employee wellness programs, so hope this is relevant.
81
89
 
82
90
  most annual physicals test 15 biomarkers max.
83
91
 
84
- there's over 100 that actually matter and the gap is driving the surprise expensive claims every year
92
+ Superpower looks at 100+ biomarkers and screens for 1,000+ conditions from one draw.
93
+
94
+ teams like Lyft and Notion are already exploring this at $199 a person.
85
95
 
86
- teams like Lyft and Notion are already exploring this. one test, 1,000+ conditions, $199 a person
96
+ if preventive health is nowhere near your lane, ignore me.
87
97
 
88
- can I send over some more info?
98
+ should i send over the short version?
89
99
 
90
100
  **Example 3 (Variant 1 — employee wellness programs):**
91
101
  Subject: princess/prab intro
92
102
 
93
- hey princess, saw you were active around employee wellness programs content recently and figured this might actually be relevant
103
+ hey princess,
104
+
105
+ saw you in a few conversations around employee wellness programs, so hope this is relevant.
94
106
 
95
- any chance you're exploring preventive health programs at Marriott?
107
+ if preventive health is anywhere near the benefits plan at Marriott, Superpower may be worth a look.
96
108
 
97
- we screen for 1,000+ conditions from a single blood draw and surface risks before they ever become claims.
109
+ it screens for 1,000+ conditions from a single blood draw and surfaces risks before they become claims.
98
110
 
99
- basically your team gets to see what's coming instead of just reacting to it
111
+ basically your team gets to see what's coming instead of only reacting to it.
100
112
 
101
- can I send over some more info?
113
+ should i send over the short version?
102
114
 
103
115
  ## Social Proof
104
116
 
@@ -112,7 +124,8 @@ Teams like Lyft and Notion are exploring Superpower's early detection platform.
112
124
  - **ICP filtering:** All prospects filtered against ICP criteria before entering send queue
113
125
  - **Positioning:** Early detection tool for claims prevention, not a wellness benefit
114
126
  - **Tone:** All lowercase, casual, peer-to-peer - building relationship before asking
115
- - **Two approved variants:** Testing different hooks (exploratory vs. problem-aware)
127
+ - **Two approved variants:** Testing a low-certainty signal bridge vs. proof-led
128
+ benefits mechanism
116
129
 
117
130
  ### Rubric Markdown
118
131
 
@@ -212,8 +225,8 @@ Teams like Lyft and Notion are already using early detection screening. One bloo
212
225
 
213
226
  **Subject: Prab/{{first_name}} intro**
214
227
 
215
- Hey {{first_name}}, not sure if you've looked into this but felt it may be relevant to your work.
228
+ Hey {{first_name}},
216
229
 
217
- have you ever looked into early detection or preventive health programs for {{company}}?
230
+ hope this is relevant if preventive health is anywhere near the benefits plan at {{company}}.
218
231
 
219
- we screen for 1,000+ conditions from a single blood draw and surface risks before they ever become claims.
232
+ Superpower screens for 1,000+ conditions from a single blood draw and surfaces risks before they become claims.
@@ -14,7 +14,8 @@ Included as primary gold examples:
14
14
  - `Galley`
15
15
  - `Clover`
16
16
  - `Persona`
17
- - `Superpower`
17
+ - `Superpower` — domain-language reference only; use the cleaned low-certainty
18
+ opener, not retired engagement-source phrasing
18
19
 
19
20
  Not included in runtime inspiration:
20
21
 
@@ -33,6 +34,9 @@ Not included in runtime inspiration:
33
34
 
34
35
  - Feed only endorsed examples into generation.
35
36
  - Keep bad lines only if they are explicitly labeled `BAD` and paired with a `BETTER` version.
37
+ - Treat sellable.dev, Hey Digital, Persona, Galley, and Clover as the primary
38
+ line-level quality anchors. Superpower is useful for benefits/healthcare
39
+ mechanism language, but it must not outrank those examples on opener style.
36
40
  - Default to one approved message in the generated brief unless the ICP is genuinely broad.
37
41
  - A/B CTA is optional. Use it only when the second option is truly strong.
38
42
  - If there is a great low-friction proof asset or case study, that is often the best Option B.
@@ -213,22 +217,21 @@ Why included:
213
217
 
214
218
  - simple language in a hard domain
215
219
  - useful plain-language healthcare constraint example
216
- - why it works: it asks about the buyer's existing benefits priority, explains
217
- the mechanism in plain language, and keeps the ask tiny instead of forcing a
218
- call
220
+ - why it works: it uses a low-certainty signal bridge, explains the mechanism
221
+ in plain language, and keeps the ask tiny instead of forcing a call
219
222
 
220
223
  ```md
221
224
  Hey {{first_name}},
222
225
 
223
- not sure if you've looked into this but felt it may be relevant to your work.
226
+ saw you in a few conversations around {{topic}}, so hope this is relevant.
224
227
 
225
- have you ever looked into early detection or preventive health programs for {{company}}?
228
+ if preventive health is anywhere near the benefits plan at {{company}}, Superpower may be worth a look.
226
229
 
227
- we screen for 1,000+ conditions from a single blood draw and surface risks before they ever become claims.
230
+ it screens for 1,000+ conditions from a single blood draw and surfaces risks before they become claims.
228
231
 
229
- basically your team gets to see what's coming instead of just reacting to it
232
+ basically your team gets to see what's coming instead of only reacting to it.
230
233
 
231
- can I send over some more info?
234
+ should i send over the short version?
232
235
  ```
233
236
 
234
237
  Locked production variant from the same Superpower campaign:
@@ -47,12 +47,13 @@ recite profile facts. `"I noticed your..."` reads as scraped intel.
47
47
  **Allowed alternative:** Use a concise permissioned bridge:
48
48
  `"Hope this is relevant if X is still live."`, `"Saw you might be
49
49
  interested in X, so hope this is relevant."`, `"Saw you in a few
50
- conversations around X, so hope this is relevant."` for LinkedIn-post-sourced
51
- campaigns, or the self-aware
52
- `"saw you raise your hand for X, so figured this was (hopefully) worth
53
- sending"` or `"saw you raise your hand for X (creepy to reach out based
54
- on that, i know) - but this felt too on the nose to ignore"` shapes when the
55
- engagement source is the reason for the note.
50
+ conversations around X, so hope this is relevant."`, or `"Found you in a
51
+ thread about X, so may be off, but this seemed relevant."` for
52
+ LinkedIn-post-sourced campaigns. Use the self-aware `"saw you raise your
53
+ hand for X, so figured this was (hopefully) worth sending"` or `"saw you
54
+ raise your hand for X (creepy to reach out based on that, i know) - but
55
+ this felt too on the nose to ignore"` shapes only when the source was an
56
+ explicit lead-magnet comment, reply, or opt-in.
56
57
 
57
58
  **Severity:** REJECT
58
59
 
@@ -280,10 +281,12 @@ reach-out.
280
281
  **Allowed alternative:** Use a concise topic-level bridge when the
281
282
  source is meaningful, then continue with apologetic uncertainty:
282
283
  `"Saw you in a few conversations about LinkedIn outreach, so may be
283
- off, but this seemed relevant."` or `"Saw you in a few conversations
284
- around LinkedIn outreach, so hope this is relevant."` If the source was
285
- only casual reading or the role/topic connection is weak, omit the
286
- personalization line and open from the buyer pain.
284
+ off, but this seemed relevant."`, `"Saw you in a few conversations
285
+ around LinkedIn outreach, so hope this is relevant."`, or `"Found you in
286
+ a thread about LinkedIn outreach, so may be off, but this seemed
287
+ relevant."` If the source was only casual reading or the role/topic
288
+ connection is weak, omit the personalization line and open from the
289
+ buyer pain.
287
290
 
288
291
  **Severity:** REJECT
289
292
 
@@ -305,6 +308,28 @@ does not narrate the source.
305
308
 
306
309
  **Severity:** REJECT
307
310
 
311
+ ## Tell #17 — Flattened "worth sending" source bridge
312
+
313
+ **Pattern:** `"saw you raise your hand for [topic], so figured this was
314
+ worth sending"` / `"figured this was worth sending"` without the
315
+ parenthetical uncertainty `(hopefully)` or a `hope this is relevant`
316
+ bridge.
317
+
318
+ **Why it's an AI tell:** It sounds like a model trying to justify the
319
+ outreach after reading a signal. The flat version makes the sender sound
320
+ over-certain and self-focused: "I decided this was worth sending." Real
321
+ operators usually soften the bridge or make it explicitly tentative.
322
+
323
+ **Allowed alternative:** Use a permissioned, lower-certainty bridge:
324
+ `"saw you raise your hand for [topic], so figured this was (hopefully)
325
+ worth sending."` only for explicit lead-magnet comments, replies, or
326
+ opt-ins. Otherwise use `"saw you might be interested in [topic], so hope
327
+ this is relevant."`, `"saw you in a few conversations around [topic], so
328
+ hope this is relevant."`, or `"found you in a thread about [topic], so
329
+ may be off, but this seemed relevant."`
330
+
331
+ **Severity:** REJECT
332
+
308
333
  ---
309
334
 
310
335
  ## How to add new tells
@@ -413,7 +413,7 @@ queue, attach sequence, or start. If a draft shell exists, leave it paused/
413
413
  non-sendable for operator cleanup instead of silently deleting a workspace row.
414
414
 
415
415
  Draft effect: move the draft directory to
416
- `.sellable/create-campaign-v2/drafts/{workspace-slug}/.aborted/{campaign-slug}-{timestamp}/`.
416
+ `~/.sellable/create-campaign-v2/drafts/{workspace-slug}/.aborted/{campaign-slug}-{timestamp}/`.
417
417
  Legacy no-shell runs touch no DB rows and create no `CampaignOffer`.
418
418
  No DB rows touched in legacy no-shell aborts; draft-shell aborts leave the
419
419
  non-sendable shell for operator cleanup.
@@ -22,6 +22,13 @@ Do not put active validation fixtures in this file as exact company-specific
22
22
  examples. The library should teach transferable winning motions, not leak the
23
23
  fixture answer into Phase 84.
24
24
 
25
+ For line-level runtime inspiration, prefer
26
+ `mcp/sellable/skills/create-campaign-v2/references/gold-standard-runtime-message-pack.md`.
27
+ That file contains the real sellable.dev, Hey Digital, Persona, Galley, and
28
+ Clover examples. Use this file for strategy skeletons and guardrails. If an old
29
+ archive line conflicts with the runtime pack, the runtime pack wins; do not let
30
+ synthetic or retired opener phrasing outrank the real examples.
31
+
25
32
  ## Example 1: Revvix / Spektion Event-Led Security
26
33
 
27
34
  Use when the brief has:
@@ -227,21 +234,23 @@ Use when the brief has:
227
234
  - signal-led topic engagement
228
235
  - benefits / rewards / wellness buyers
229
236
  - proof-heavy preventive-health positioning
237
+ - a weak engagement signal that should be framed as a low-certainty relevance
238
+ bridge, not buyer intent
230
239
 
231
240
  Template shape:
232
241
 
233
242
  ```text
234
243
  hey {{first name}},
235
244
 
236
- saw you were active around some {{topic}} stuff recently and figured this might actually be relevant
245
+ saw you in a few conversations around {{topic}}, so hope this is relevant.
237
246
 
238
- any chance you're exploring early detection or preventive health programs at {{company}}?
247
+ if preventive health is anywhere near the benefits plan at {{company}}, Superpower may be worth a look.
239
248
 
240
- we screen for 1,000+ conditions from a single blood draw and surface risks before they ever become claims.
249
+ it screens for 1,000+ conditions from a single blood draw and surfaces risks before they become claims.
241
250
 
242
- basically your team gets to see what's coming instead of just reacting to it
251
+ basically your team gets to see what's coming instead of only reacting to it.
243
252
 
244
- can I send over some more info?
253
+ should i send over the short version?
245
254
  ```
246
255
 
247
256
  Alternative proof-led variant:
@@ -249,24 +258,25 @@ Alternative proof-led variant:
249
258
  ```text
250
259
  hey {{first name}},
251
260
 
252
- saw you were active in some {{topic}} conversations recently and wanted to run something by you
261
+ saw you in a few conversations around {{topic}}, so hope this is relevant.
253
262
 
254
263
  most annual physicals test 15 biomarkers max.
255
264
 
256
- there's over 100 that actually matter and the gap between those two numbers is where the expensive claims tend to sit
265
+ Superpower looks at 100+ biomarkers and screens for 1,000+ conditions from one draw.
257
266
 
258
- teams like Lyft and Notion are already exploring this. one draw, 1,000+ conditions, $199 a person.
267
+ teams like Lyft and Notion are already exploring this at $199 a person.
259
268
 
260
- if your claims costs have been going up and you're not sure where it's coming from... that gap may be a good place to start looking
269
+ if preventive health is nowhere near your lane, ignore me.
261
270
 
262
- can I send over some more info?
271
+ should i send over the short version?
263
272
  ```
264
273
 
265
274
  Why it works:
266
275
 
267
- - signal comes first
276
+ - the topic signal is low-certainty and does not imply intent
277
+ - `hope this is relevant` is safer than `figured this might actually be relevant`
268
278
  - all lowercase matters
269
- - the CTA stays tiny
279
+ - the CTA stays tiny but specific enough to picture
270
280
  - this should not get polished into generic benefits copy
271
281
  - the proof sentence does real work; it is not optional filler
272
282
 
@@ -286,9 +296,7 @@ Template shape:
286
296
  ```text
287
297
  hey {{first_name}},
288
298
 
289
- reaching out because it looked like you were active around some {{signal_topic}} recently.
290
-
291
- figured this might actually be relevant.
299
+ saw you in a few conversations around {{signal_topic}}, so hopefully relevant.
292
300
 
293
301
  [product] does [simple one-line mechanism].
294
302
 
@@ -304,7 +312,7 @@ p.s. [short proof line]
304
312
  Why it works:
305
313
 
306
314
  - the signal is first and easy to understand
307
- - the "figured this might actually be relevant" line feels honest without
315
+ - the "hopefully relevant" line feels honest without
308
316
  over-explaining
309
317
  - the product is framed simply
310
318
  - "two options" makes the CTA easy to scan
@@ -339,12 +347,18 @@ Use these patterns to avoid generic asks like:
339
347
  - worth a conversation?
340
348
  - open to a call?
341
349
  - worth a look?
350
+ - open to compare notes?
342
351
 
343
352
  Prefer a binary or useful CTA when the brief supports it.
344
353
 
345
354
  CTA decision rule:
346
355
 
347
356
  - generate single-ask and A/B options before deciding
357
+ - preserve a brief-approved CTA intent when it can be made concrete, but avoid
358
+ the phrase `compare notes` in buyer-facing copy. If the brief uses that
359
+ shorthand, translate it into a concrete quick-call or working-session CTA,
360
+ e.g. `Open to a quick call on how your team might turn LinkedIn content into
361
+ pipeline?`
348
362
  - use A/B only when both choices are genuinely useful and supported
349
363
  - for unfamiliar categories, the CTA should name the buyer-specific preview in
350
364
  one short phrase, not list every screen or workflow
@@ -164,7 +164,7 @@ Shape:
164
164
  Prefer:
165
165
 
166
166
  - lowercase or casual casing when the motion supports it
167
- - an honest line like "figured this might actually be relevant"
167
+ - an honest line like "hope this is relevant" or "so hopefully relevant"
168
168
  - two clean options instead of a long CTA paragraph
169
169
  - direct wording over polished marketing language
170
170