@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
|
@@ -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
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
|
208
|
-
-
|
|
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
|
|
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
|
|
539
|
-
|
|
540
|
-
`{{
|
|
541
|
-
source-citation phrases
|
|
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
|
-
|
|
548
|
-
|
|
549
|
-
|
|
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
|
|
1160
|
-
|
|
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
|
|
1197
|
-
is reserved for AI-native tokens; field
|
|
1198
|
-
\`{{snake_case}}\` and continue to work as direct
|
|
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,
|
|
1963
|
-
|
|
1964
|
-
|
|
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
|
|