@sellable/mcp 0.1.75 → 0.1.77

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.75",
3
+ "version": "0.1.77",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -922,6 +922,13 @@ Required behavior:
922
922
  - preserve recurring keep/exclude filter families that show up across campaign
923
923
  history: buyer role, wrong-function exclusions, company-type exclusions,
924
924
  competitor/vendor exclusions, geography, company size, and active-role status
925
+ - treat right role/function, right seniority/authority, account/channel fit,
926
+ economic capacity, competitor/vendor exclusion, and active current-role status
927
+ as table-stakes buyer-quality gates; include geography/market whenever budget,
928
+ channel adoption, language, compliance, or delivery assumptions depend on it
929
+ - do not turn "shown interest", post engagement, Signals source, recent posting,
930
+ provider source, or first-send priority into a production filter; those are
931
+ discovery or messaging context, not proof the lead is qualified
925
932
  - use the actual lead sample to identify repeated false positives
926
933
  - prefer required keep/exclude rules over a broad scoring stack
927
934
  - allow at most one optional/supporting rule when it materially helps later
@@ -10,6 +10,14 @@ to buying." A lead who may reply but cannot buy, lacks budget, sits at the wrong
10
10
  account type, is a vendor/competitor, or is on the wrong side of a marketplace
11
11
  is not a good lead.
12
12
 
13
+ Source interest is not qualification. A lead who engaged with a post, appeared
14
+ in a Signals search, recently posted on LinkedIn, or "showed interest" in the
15
+ topic has only supplied discovery context. That context can justify the source
16
+ lane, improve pass-rate confidence, or help message generation; it must not
17
+ become a production filter or `leadScoringRubric` item. If the source lane was
18
+ built from topical engagement, the filter should still ask: is this the right
19
+ role, seniority, account type, budget band, market, and non-competitor?
20
+
13
21
  Inputs:
14
22
 
15
23
  - `brief.md`
@@ -61,6 +69,36 @@ Use the actual sample to answer:
61
69
  - whether the filtered leads are economically worth sending to, using the best
62
70
  campaign-native proxy available from row data, enrichment, or Googleable facts
63
71
 
72
+ ## Table-Stakes Qualification Gates
73
+
74
+ Confirmed production filters should fail closed on buyer quality. The default
75
+ confirmed filter set must explicitly include each table-stakes gate below, or
76
+ `lead-filter.md` must state why a gate is irrelevant for this campaign:
77
+
78
+ - right role / function: the person owns or directly influences the buyer
79
+ problem; wrong-function leads fail even when they match the source topic
80
+ - right seniority / authority: the person can approve, pilot, champion, or
81
+ materially influence adoption; junior ICs fail unless the brief explicitly
82
+ targets them
83
+ - account and channel fit: the company is the right account type and its buyers
84
+ are reachable through the chosen channel, such as LinkedIn for LinkedIn
85
+ outbound campaigns
86
+ - economic capacity / ability to buy: the company has an appropriate budget
87
+ proxy for the offer, such as headcount, revenue, funding, team size, practice
88
+ size, location count, department maturity, or existing tooling
89
+ - competitor / vendor / wrong-side exclusion: competitors, adjacent vendors,
90
+ agencies/service providers, resellers, and marketplace-side conflicts fail
91
+ unless the brief explicitly targets that group
92
+ - geography / market fit: include the campaign's market, language, region, or
93
+ tier-country constraint when budget, channel adoption, compliance, or delivery
94
+ assumptions depend on it
95
+ - active current-role safety: score the person's current role and company, not
96
+ stale prior roles, advisor blurbs, investor bios, or old engagement context
97
+
98
+ Do not replace these gates with a "shown interest" or "engaged with relevant
99
+ content" rule. Interest can help find a warmer list, but it does not prove the
100
+ lead is a buyer.
101
+
64
102
  ## Standard Competitor / Vendor Exclusion
65
103
 
66
104
  Every confirmed filter should include a competitor / vendor / wrong-side
@@ -195,17 +233,21 @@ Rules:
195
233
  - do not put source-path mechanics or send-priority hints into
196
234
  `leadScoringRubrics`. Examples: recently posted on LinkedIn, came from a
197
235
  Signals search, appeared in Sales Nav, was found by Prospeo, first-send wave,
198
- or priority cohort. If that signal was already used in the search, mention it
199
- in `Pass Rate` or `Recommendation`; if it is useful but not required, keep it
200
- as prose under `Optional Supporting Rule`, not as a production rubric.
236
+ priority cohort, engaged with selected posts, showed interest in the topic,
237
+ or matched a signal-discovery keyword. If that signal was already used in the
238
+ search, mention it in `Pass Rate` or `Recommendation`; if it helps messaging,
239
+ pass it to message generation as source context, not as a production rubric or
240
+ supporting fit rule.
201
241
  - do not put DNC or one-off relationship-safety notes into
202
242
  `leadScoringRubrics` unless the sample shows that family is likely to leak at
203
243
  meaningful volume and normal DNC/domain suppression will not catch it. Former
204
244
  employers, existing customers, investors, partner lists, and "do not contact"
205
245
  domains usually belong in `Recommendation` or a DNC note, not in ICP scoring.
206
246
  - confirmed `leadScoringRubrics` must protect sales quality, not just surface
207
- similarity. They should usually cover:
208
- - buyer authority / role fit
247
+ similarity. They must cover the table-stakes qualification gates unless
248
+ `lead-filter.md` explicitly justifies why a gate is irrelevant:
249
+ - right role / function fit
250
+ - buyer seniority / authority
209
251
  - account or company-type fit
210
252
  - economic capacity / ability to buy, using a campaign-native proxy such as
211
253
  headcount, revenue, funding, practice size, location count, patient volume,
@@ -311,7 +353,7 @@ Recommended rubric grouping:
311
353
  - economic capacity / ability to buy
312
354
  - geography / size / stage fit, when relevant
313
355
  - competitor / vendor / wrong-side / repeated false-positive exclusion
314
- - one optional buyer-quality signal, at most, only when it changes fit scoring
356
+ - one optional buyer-quality qualifier, at most, only when it changes fit scoring
315
357
  rather than send ordering
316
358
 
317
359
  Rubric-readiness checklist:
@@ -92,6 +92,8 @@ Required dry-mode contract:
92
92
  - use `lead-filter.md` once available to decide which find-leads sample rows
93
93
  remain valid for the final winner and which false-positive patterns must be
94
94
  avoided
95
+ - use `lead-filter.md` only to decide which find-leads sample rows remain valid;
96
+ never use it to create replacement sample rows
95
97
  - do not mark `message-validation.md` as final or ready for message review until
96
98
  `lead-filter.md` exists and the selected winner cites only rows that still
97
99
  pass the filter
@@ -114,6 +116,8 @@ Read:
114
116
  - `lead-filter.md` when present. If it is absent because the caller launched
115
117
  post-lead workstreams in parallel, start the prep/candidate stages and then
116
118
  reconcile before final `message-validation.md`.
119
+ - `mcp/sellable/skills/create-campaign/references/ai-native-tokens.md`
120
+ - `mcp/sellable/skills/create-campaign/references/token-fill-examples.md`
117
121
  - `mcp/sellable/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md`
118
122
  - `mcp/sellable/skills/create-campaign-v2/references/validation-criteria.md`
119
123
  - `mcp/sellable/skills/create-campaign-v2/references/thomas-revision-filters.md`
@@ -121,6 +125,30 @@ Read:
121
125
  - `mcp/sellable/skills/create-campaign-v2/references/gold-standard-message-examples.md`
122
126
  - `mcp/sellable/skills/create-campaign-v2/references/gold-standard-message-validation-example.md`
123
127
 
128
+ ### Rich Personalization Contract
129
+
130
+ `mcp/sellable/skills/create-campaign/references/ai-native-tokens.md` is the
131
+ canonical spec for personalization that requires judgment. Load it before
132
+ writing the Token Fill Rules or any reusable template notes.
133
+
134
+ - Sentence-level personalization must use AI-native bracket tokens in the
135
+ reusable template / token plan, not old-school field substitution. Field
136
+ tokens such as `{{first_name}}` and `{{company}}` are fine for atomic slots.
137
+ Do not collapse rich personalization into `{{workflow_context}}`,
138
+ `{{company}}`, or another noun-shaped token when the line needs judgment.
139
+ - Use this shape for any hook, bridge, or row-specific relevance line:
140
+ `[PERSONALIZATION_LINE — Intent: write one short sentence that anchors the
141
+ note to the prospect's buyer-relevant activity. DO: name what they do, write
142
+ about, focus on, or build toward. DON'T: name a product their company sells,
143
+ use source-citation phrasing, or use generic nouns like "your work".
144
+ FALLBACK: if unsupported, omit the entire line.]`
145
+ - The bracketed token belongs in the reusable template / token plan only. The
146
+ rendered `Selected Winner` and sample messages must contain the composed
147
+ sentence or no line at all; never show the bracket to the buyer.
148
+ - If the campaign truly only needs an atomic field value, document it as a
149
+ field token. If the value is a sentence, phrase, buyer-activity judgment, or
150
+ synthesis of multiple row fields, author it as AI-native.
151
+
124
152
  Dry-mode output must follow this flow: **element pool → gold-standard
125
153
  strategy map → current-campaign translation → element scoring → agent
126
154
  dialogue cross-review → angle drafts → kill/combine review → finalists →
@@ -535,18 +563,24 @@ The winner entry must:
535
563
  token plan instead.
536
564
  - never use generic signal tokens like `{{recentSignal}}`,
537
565
  `{{recent_signal}}`, or `{{recent_signal_quote}}`. If row personalization
538
- is needed, use concrete enriched-row fields such as `{{post_context}}`,
539
- `{{comment_summary}}`, `{{profile_summary}}`, `{{source_post_topic}}`,
540
- `{{headline}}`, or `{{row_proof_note}}`, and make the line work without
541
- source-citation phrases like `caught my eye`.
566
+ is needed in the raw selected winner, render the concrete sentence from
567
+ enriched-row fields such as `{{post_context}}`, `{{comment_summary}}`,
568
+ `{{profile_summary}}`, `{{source_post_topic}}`, `{{headline}}`, or
569
+ `{{row_proof_note}}`, and make the line work without source-citation phrases
570
+ like `caught my eye`. For the reusable template / token plan behind that
571
+ rendered line, prefer an AI-native bracket token with inline Intent / DO /
572
+ DON'T / FALLBACK rules; only use a row-derived `{{field_token}}` when the
573
+ inserted value is truly atomic.
542
574
  - never use `{{profile_signal}}` in selected copy, message-review templates,
543
575
  or rendered examples. It is an internal analysis bucket, not a sendable row
544
576
  token. Lines like `{{profile_signal}} is why I thought this might be
545
577
  relevant for {{company}}` are BLOCKED because they expose enrichment logic
546
578
  and read as AI-generated mail merge. If the underlying signal is strong,
547
- convert it into a named row-derived context token such as
548
- `{{workflow_context}}`, `{{source_post_topic}}`, or `{{row_proof_note}}`;
549
- if it is weak, omit the personalization line.
579
+ render it into a buyer-readable sentence in the selected copy and document
580
+ the reusable template as an AI-native token. Use named row-derived context
581
+ tokens such as `{{workflow_context}}`, `{{source_post_topic}}`, or
582
+ `{{row_proof_note}}` only when the value is an atomic phrase that drops into
583
+ the sentence without judgment; if it is weak, omit the personalization line.
550
584
 
551
585
  Finalizer preference when multiple candidates are otherwise comparable:
552
586
 
@@ -1156,8 +1190,11 @@ yours` are not enough when a safe row token would make the line feel more
1156
1190
  {{reporting_context}} sits in the kind of reporting ownership...`, `your
1157
1191
  {{role_context}} work`, or `noticed your {{topic}}` are BLOCKED when the filled
1158
1192
  version sounds like mail merge. A good token should either make the sentence
1159
- more concrete in normal language or be omitted. If the row signal is weak,
1160
- write the segment-level line and document the omit rule.
1193
+ more concrete in normal language or be omitted. If the context needs the
1194
+ model to decide what the sentence should say, use an AI-native bracket token
1195
+ in the reusable template / token plan instead of a noun-shaped
1196
+ `{{workflow_context}}`-style slot. If the row signal is weak, write the
1197
+ segment-level line and document the omit rule.
1161
1198
  - **No product-noun substitution in possessive frames (HARD INVARIANT):** when
1162
1199
  a token sits inside a possessive frame like `your {{X}}`, `at your {{X}}`,
1163
1200
  or `because of your {{X}}`, the filled value MUST describe something the
@@ -1193,9 +1230,12 @@ Engineering writing` (ALLOWED — what they do publicly). The omit-fallback
1193
1230
  gold pack: \`[PERSONALIZED REASON — their team size, role, or why
1194
1231
  they're a perfect fit]\` — the model picks whichever input the row supports
1195
1232
  and writes one short sentence in the sender's voice. Full spec:
1196
- \`references/ai-native-tokens.md\`. The \`[ALL_CAPS_NAME — ...]\` shape
1197
- is reserved for AI-native tokens; field substitutions stay as
1198
- \`{{snake_case}}\` and continue to work as direct value injections.
1233
+ \`mcp/sellable/skills/create-campaign/references/ai-native-tokens.md\`. The
1234
+ \`[ALL_CAPS_NAME — ...]\` shape is reserved for AI-native tokens; field
1235
+ substitutions stay as \`{{snake_case}}\` and continue to work as direct
1236
+ value injections. Do not collapse rich personalization into
1237
+ \`{{workflow_context}}\`, \`{{company}}\`, or another field token just because
1238
+ those are easier to list in Token Fill Rules.
1199
1239
  - **No internal profile-signal token:** `{{profile_signal}}` is never allowed
1200
1240
  in customer-facing copy, message-review templates, rendered examples, token
1201
1241
  notes, or approval-packet message bodies. It names how enrichment classified
@@ -1950,8 +1990,8 @@ shipping this template".
1950
1990
 
1951
1991
  ## Token Fill Rules
1952
1992
 
1953
- | Token | Source Field | Allowed Transformation | Fallback | Result |
1954
- | ----- | ------------ | ---------------------- | -------- | ------ |
1993
+ | Token | Type | Source Field / Instructions | Allowed Transformation | Fallback | Result |
1994
+ | ----- | ---- | --------------------------- | ---------------------- | -------- | ------ |
1955
1995
 
1956
1996
  If `{{company}}` or another account-context token is available, document
1957
1997
  whether it was tested as a believability personalization, not only whether it
@@ -1959,9 +1999,12 @@ was technically available. Use it when it grounds a generic phrase without
1959
1999
  creating employer-blame, employer-permission, legal, or scrape-y risk. If it is
1960
2000
  omitted, state the specific reason it would not improve believability.
1961
2001
  Do not define or use `{{profile_signal}}`. Treat it as an internal enrichment
1962
- classification only. When a profile-derived signal is genuinely useful, define
1963
- a buyer-readable derived token such as `{{workflow_context}}` or
1964
- `{{role_specialization}}` and show both its clean fill rule and omit fallback.
2002
+ classification only. When a profile-derived signal is genuinely useful, prefer
2003
+ an AI-native token for the full personalization sentence and show the inline
2004
+ Intent / DO / DON'T / FALLBACK contract in the table or immediately below it.
2005
+ Only define a buyer-readable derived token such as `{{workflow_context}}` or
2006
+ `{{role_specialization}}` when it is a clean atomic phrase, and show both its
2007
+ fill rule and omit fallback.
1965
2008
  When raw `{{company}}` is awkward but employer grounding still helps, define
1966
2009
  `{{employer_context}}` as a row-derived token: fill with the clean company name
1967
2010
  when natural, otherwise `your group`, `your bank`, `your team`, or the closest
@@ -1977,9 +2020,13 @@ hiring for`
1977
2020
  - `{{role_specialization}}` = buyer-native specialization from title/headline;
1978
2021
  fallback broad role only when specialization is absent
1979
2022
  - `{{workflow_context}}` = concrete public workflow clue; fallback omitted, not
1980
- generic filler
2023
+ generic filler; use only for atomic phrases, not sentence-level
2024
+ personalization that needs judgment
1981
2025
  - `{{account_segment}}` = row-derived account category when it improves fit;
1982
2026
  fallback brief-level segment only when every row shares it
2027
+ - `[PERSONALIZATION_LINE — Intent: ... DO: ... DON'T: ... FALLBACK: omit]` =
2028
+ AI-native sentence token; source from the lead sample fields that support the
2029
+ DO rules; fallback omit the whole line, never generic filler
1983
2030
 
1984
2031
  ## Token Adherence Table
1985
2032