@sellable/mcp 0.1.204 → 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.
- package/agents/post-find-leads-message-scout.md +16 -4
- package/dist/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/tools/prompts.js +3 -2
- package/package.json +1 -1
- package/skills/create-campaign-v2/references/ai-tells.md +35 -10
- package/skills/create-campaign-v2/references/thomas-revision-filters.md +6 -2
- package/skills/generate-messages/SKILL.md +73 -23
|
@@ -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.
|
|
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
|
-
|
|
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 `
|
|
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
|
|
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.
|
package/dist/index-dev.js
CHANGED
|
File without changes
|
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/tools/prompts.js
CHANGED
|
@@ -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
|
@@ -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."`
|
|
51
|
-
|
|
52
|
-
`"saw you raise your
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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."
|
|
284
|
-
around LinkedIn outreach, so hope this is relevant."
|
|
285
|
-
|
|
286
|
-
|
|
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
|
|
@@ -74,7 +74,7 @@ Revise or reject the sample when any of these happen.
|
|
|
74
74
|
- **actions are implied, not stated** — e.g. "runs that chain as AI agents" when a clearer version would name the specific actions (verb + object, one per line)
|
|
75
75
|
- **category-level opener used when a per-lead signal exists** — if `lead-sample.json` carries any per-lead signal (post, hire, visible tool, topic engagement), the opener must reference it. Category-level openers of shape `"Most [category] teams still do X by hand"` are only acceptable when zero per-lead signal is in the sample. When a category-level opener is used as fallback, Findings must flag it explicitly
|
|
76
76
|
- **mind-reading from engagement signals** — a topic engagement, post, public activity, role, company, or hiring trigger does not prove buyer intent. Reject phrases like `"AI-GTM stack is clearly on your mind"`, `"you're clearly focused on..."`, `"obviously relevant"`, or `"already thinking about..."` unless that exact priority is explicitly present in `lead-sample.json`. Translate to low-certainty buyer context or omit the signal from copy.
|
|
77
|
-
- **source-y signal narration** — reject `"saw you on..."`, `"saw you engaging with..."`, `"you commented on..."`, `"your LinkedIn activity..."`, `"you might not remember the thread..."`, `"found you through [source] and your role looked close..."`, or any line that makes the recipient feel watched unless the chosen archived motion is intentionally self-aware about the signal. For LinkedIn-post-sourced campaigns, a topic-level bridge is allowed when it explains why the note exists and stays apologetically uncertain: `"saw you in a few conversations about [topic], so may be off, but this seemed relevant."
|
|
77
|
+
- **source-y signal narration** — reject `"saw you on..."`, `"saw you engaging with..."`, `"you commented on..."`, `"your LinkedIn activity..."`, `"you might not remember the thread..."`, `"found you through [source] and your role looked close..."`, or any line that makes the recipient feel watched unless the chosen archived motion is intentionally self-aware about the signal. For LinkedIn-post-sourced campaigns, a topic-level bridge is allowed when it explains why the note exists and stays apologetically uncertain: `"saw you in a few conversations about [topic], so may be off, but this seemed relevant."`, `"saw you in a few conversations around [topic], so hope this is relevant."`, or `"found you in a thread about [topic], so may be off, but this seemed relevant."` Reserve `"raise your hand"` language for explicit lead-magnet comments, replies, or opt-ins. Translate the signal into natural buyer context or omit it.
|
|
78
78
|
- **assumptive title-fit opener** — reject `"Your [role] role at [company] looked close to this problem"` or `"looked close to this outbound campaign problem"`. This asserts fit from title/company. Keep the apologetic uncertainty instead: `"may be off, but if [workflow] is anywhere near your lane..."`.
|
|
79
79
|
- **internal-metric flex** — reject compute time, token/cache details, model names, agent-counts, orchestration internals, or similar process metrics unless the brief proves the buyer cares about that exact detail. `~5 min of compute per message` is not buyer value by itself.
|
|
80
80
|
- **action lines are parallel and harder to scan as paragraphs** — when 3
|
|
@@ -375,10 +375,14 @@ your lane, this might be useful.`
|
|
|
375
375
|
this is relevant.`
|
|
376
376
|
- `Hey {{first_name}}, saw you in a few conversations around [topic],
|
|
377
377
|
so hope this is relevant.`
|
|
378
|
+
- `Hey {{first_name}}, found you in a thread about [topic], so may be
|
|
379
|
+
off, but this seemed relevant.`
|
|
378
380
|
- `Hey {{first_name}}, saw you raise your hand for [topic], so figured
|
|
379
|
-
this was (hopefully) worth sending.`
|
|
381
|
+
this was (hopefully) worth sending.` Only for explicit lead-magnet
|
|
382
|
+
comments, replies, or opt-ins.
|
|
380
383
|
- `Hey {{first_name}}, saw you raise your hand for [topic] (creepy to
|
|
381
384
|
reach out based on that, i know) - but this felt too on the nose to ignore.`
|
|
385
|
+
Only for explicit lead-magnet comments, replies, or opt-ins.
|
|
382
386
|
- `Hey {{first_name}}, quick one. My co-founder and I left [prior
|
|
383
387
|
role] to build [X].`
|
|
384
388
|
- `Hey {{first_name}}, reaching out because [one-line sender
|
|
@@ -133,7 +133,7 @@ hard failure and revise the output before returning it.
|
|
|
133
133
|
|
|
134
134
|
Dry mode validates message quality before campaign mint.
|
|
135
135
|
|
|
136
|
-
Read:
|
|
136
|
+
Read these campaign inputs:
|
|
137
137
|
|
|
138
138
|
- `~/.sellable/configs/core/about-me.md`
|
|
139
139
|
- `~/.sellable/configs/core/my-company.md`
|
|
@@ -148,20 +148,57 @@ Read:
|
|
|
148
148
|
- `lead-filter.md` when present. If it is absent because the caller launched
|
|
149
149
|
post-lead workstreams in parallel, start the prep/candidate stages and then
|
|
150
150
|
reconcile before final `message-validation.md`.
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
- `
|
|
158
|
-
-
|
|
151
|
+
|
|
152
|
+
### Reference Asset Loading (do this before drafting)
|
|
153
|
+
|
|
154
|
+
Do not draft from this prompt alone. The full `generate-messages` prompt is
|
|
155
|
+
only the contract; the reference assets below are the evidence and examples
|
|
156
|
+
that define the desired output. Before writing angle drafts, you MUST load the
|
|
157
|
+
required pre-draft reference pack below with `mcp__sellable__get_subskill_asset`.
|
|
158
|
+
This is a hard gate: if the four required pre-draft assets are not loaded,
|
|
159
|
+
return `blocked` / `retry-needed` instead of drafting. Write a short
|
|
160
|
+
`Reference Asset Loading` note naming each loaded asset and whether it was
|
|
161
|
+
required pre-draft, final-pass, dry-mode-only, or token-rules-only. Do not
|
|
162
|
+
bulk-load the conditional references unless their trigger applies or the caller
|
|
163
|
+
explicitly asks for maximum context over speed.
|
|
164
|
+
|
|
165
|
+
Use `mcp__sellable__get_subskill_asset` for packaged assets:
|
|
166
|
+
|
|
167
|
+
| Group | Asset to load | Job |
|
|
168
|
+
| --- | --- | --- |
|
|
169
|
+
| Always load before drafting | `subskillName: "create-campaign-brief", assetPath: "references/phase75-active-runtime-message-pack.md"` | Active line-level gold pack: real approved examples, short-line rhythm, CTA blocks, lowercase/titlecase cues, and PS restraint. |
|
|
170
|
+
| Always load before drafting | `subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-patterns.md"` | Strategy selector: event-led vs signal-led vs job-post-led vs proof-led fallback, proof inventory, candidate set, and Finalizer Pass. |
|
|
171
|
+
| Always load before drafting | `subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-examples.md"` | Full archive quality bar: exact motion examples, hard rules, and transfer limits. Use it to choose 1 primary example, not to recolor copy. |
|
|
172
|
+
| Always load before drafting (never optional) | `subskillName: "create-campaign-v2", assetPath: "references/ai-tells.md"` | Canonical anti-AI checklist: body self-intros, source citations, resume recaps, title-fit assumptions, em dashes, signoffs, weak proof brags, and flattened "worth sending" source bridges. |
|
|
173
|
+
| Load before approval / final pass | `subskillName: "create-campaign-v2", assetPath: "references/thomas-revision-filters.md"` | Substance filters: earned-right, presumption, vague proof, read-as-1:1, founder-origin coherence, anti-talk-at, and AI-tell filter. |
|
|
174
|
+
| Dry-mode artifact output only | `subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-validation-example.md"` | Fully worked example for proof inventory, candidate messages, Finalizer Pass, Selected Winner, findings, and recommendation. |
|
|
175
|
+
| Dry-mode artifact output only | `subskillName: "create-campaign-v2", assetPath: "references/validation-criteria.md"` | Step-level acceptance criteria and dry-mode message validation expectations. |
|
|
176
|
+
| Reusable token rules only | `subskillName: "create-campaign", assetPath: "references/ai-native-tokens.md"` | Token spec for rich judgment tokens, including required clauses and fallback behavior. |
|
|
177
|
+
| Reusable token rules only | `subskillName: "create-campaign", assetPath: "references/token-fill-examples.md"` | Concrete good/bad token fills, interpolation guardrails, and product-noun substitution traps. |
|
|
178
|
+
|
|
179
|
+
Default load order:
|
|
180
|
+
|
|
181
|
+
1. Load the 4 **Always load before drafting** assets. Do not infer their
|
|
182
|
+
contents from this prompt; actually call `mcp__sellable__get_subskill_asset`
|
|
183
|
+
for each required asset.
|
|
184
|
+
2. Draft and run the internal Finalizer Pass.
|
|
185
|
+
3. Run the selected winner against `ai-tells.md`. This is never optional. If the
|
|
186
|
+
AI-tells catalog was not loaded or any `REJECT` tell matches, do not approve,
|
|
187
|
+
confirm, recommend, or show the template as ready; return `revise-message`.
|
|
188
|
+
4. Load `thomas-revision-filters.md` before approval, `confirmed`, or template
|
|
189
|
+
recommendation.
|
|
190
|
+
5. Load dry-mode artifact references only when writing `message-validation.md`.
|
|
191
|
+
6. Load token-rule references only when creating reusable templates or Token
|
|
192
|
+
Fill Rules that need sentence-level personalization.
|
|
159
193
|
|
|
160
194
|
### Rich Personalization Contract
|
|
161
195
|
|
|
162
196
|
`mcp/sellable/skills/create-campaign/references/ai-native-tokens.md` is the
|
|
163
197
|
canonical spec for personalization that requires judgment. Load it before
|
|
164
198
|
writing the Token Fill Rules or any reusable template notes.
|
|
199
|
+
When token fill wording is material, use
|
|
200
|
+
`mcp/sellable/skills/create-campaign/references/token-fill-examples.md` as the
|
|
201
|
+
conditional good/bad fill reference.
|
|
165
202
|
|
|
166
203
|
- Sentence-level personalization must use AI-native bracket tokens in the
|
|
167
204
|
reusable template / token plan, not old-school field substitution. Field
|
|
@@ -328,6 +365,8 @@ artifact.**
|
|
|
328
365
|
- `saw you on {{recent_signal}}`
|
|
329
366
|
- `saw you around {{recent_signal}}`
|
|
330
367
|
- `saw you engaging with {{recent_signal}}`
|
|
368
|
+
- `saw you raise your hand for {{signal_topic}}, so figured this was worth sending`
|
|
369
|
+
- `figured this was worth sending`
|
|
331
370
|
|
|
332
371
|
Safer shapes:
|
|
333
372
|
|
|
@@ -339,8 +378,9 @@ artifact.**
|
|
|
339
378
|
- `if {{workflow_signal}} is nowhere near your lane, ignore me`
|
|
340
379
|
- `figured this might matter if {{workflow_signal}} is live at {{company}}`
|
|
341
380
|
- `thought of {{company}} because {{observable_signal}} points at {{problem_context}}`
|
|
342
|
-
- `
|
|
343
|
-
- `saw you raise your hand for {{signal_topic}}
|
|
381
|
+
- `found you in a thread about {{signal_topic}}, so may be off, but this seemed relevant`
|
|
382
|
+
- `saw you raise your hand for {{signal_topic}}, so figured this was (hopefully) worth sending` only when the source was an explicit lead-magnet comment, reply, or opt-in. The parenthetical uncertainty is load-bearing; do not flatten it to `so figured this was worth sending`.
|
|
383
|
+
- `saw you raise your hand for {{signal_topic}} (creepy to reach out based on that, i know) - but this felt too on the nose to ignore` only when the source was an explicit lead-magnet comment, reply, or opt-in and the sender's voice can carry the cheekier aside
|
|
344
384
|
|
|
345
385
|
For LinkedIn-post-sourced campaigns (commenters, reactors, lead magnet
|
|
346
386
|
replies, or scraped conversations), it is acceptable to reference the
|
|
@@ -348,7 +388,10 @@ artifact.**
|
|
|
348
388
|
activity-log-level: `saw you in a few conversations around
|
|
349
389
|
{{signal_topic}}, so hope this is relevant` is acceptable; `saw you
|
|
350
390
|
commented on {{post_context}}` and `your LinkedIn activity around...` are
|
|
351
|
-
not.
|
|
391
|
+
not. Reserve `raise your hand` phrasing for explicit lead-magnet comments,
|
|
392
|
+
replies, or opt-ins. For ordinary thread discovery, use `saw you in a few
|
|
393
|
+
conversations around {{signal_topic}}...` or `found you in a thread about
|
|
394
|
+
{{signal_topic}}...`.
|
|
352
395
|
|
|
353
396
|
Keep the apologetic nature, but aim it at uncertainty, not surveillance.
|
|
354
397
|
Good: `saw you in a few conversations about outbound, so may be off, but
|
|
@@ -1701,8 +1744,11 @@ led to it. Acceptable openers:
|
|
|
1701
1744
|
- `Hey {{first_name}}, hope this is relevant if [buyer context] is still on your plate.`
|
|
1702
1745
|
- `Hey {{first_name}}, saw you might be interested in [topic], so hope this is relevant.`
|
|
1703
1746
|
- `Hey {{first_name}}, saw you in a few conversations around [topic], so hope this is relevant.`
|
|
1704
|
-
- `Hey {{first_name}},
|
|
1705
|
-
- `Hey {{first_name}}, saw you raise your hand for [topic]
|
|
1747
|
+
- `Hey {{first_name}}, found you in a thread about [topic], so may be off, but this seemed relevant.`
|
|
1748
|
+
- `Hey {{first_name}}, saw you raise your hand for [topic], so figured this was (hopefully) worth sending.` Only use this for explicit lead-magnet comments, replies, or opt-ins.
|
|
1749
|
+
- `Hey {{first_name}}, saw you raise your hand for [topic] (creepy to reach out based on that, i know) - but this felt too on the nose to ignore.` Only use this for explicit lead-magnet comments, replies, or opt-ins.
|
|
1750
|
+
- Do not use the flattened line `so figured this was worth sending`; either keep
|
|
1751
|
+
`(hopefully)` or use `so hope this is relevant`.
|
|
1706
1752
|
- `Hey {{first_name}}, pre-[product], we [did the operator-reality
|
|
1707
1753
|
thing] for [X] years; [one-line consequence].`
|
|
1708
1754
|
- `Hey {{first_name}}, building a thing for [segment] I think you'd
|
|
@@ -1953,10 +1999,11 @@ Rules:
|
|
|
1953
1999
|
- `"Saw you might be interested in [topic], so hope this is relevant."`
|
|
1954
2000
|
- `"Saw you in a few conversations around [topic], so hope this is relevant."`
|
|
1955
2001
|
- `"Saw you in a few conversations about [topic], so may be off, but this seemed relevant."`
|
|
2002
|
+
- `"Found you in a thread about [topic], so may be off, but this seemed relevant."`
|
|
1956
2003
|
- `"Thought of {{company}} because [observable signal] points at [problem]."`
|
|
1957
2004
|
- `"Figured this might matter if [workflow] is live at {{company}}."`
|
|
1958
|
-
- `"Saw you raise your hand for [topic], so figured this was (hopefully) worth sending."`
|
|
1959
|
-
- `"Saw you raise your hand for [topic] (creepy to reach out based on that, i know) - but this felt too on the nose to ignore."`
|
|
2005
|
+
- `"Saw you raise your hand for [topic], so figured this was (hopefully) worth sending."` Only for explicit lead-magnet comments, replies, or opt-ins.
|
|
2006
|
+
- `"Saw you raise your hand for [topic] (creepy to reach out based on that, i know) - but this felt too on the nose to ignore."` Only for explicit lead-magnet comments, replies, or opt-ins.
|
|
1960
2007
|
- blocked signal use:
|
|
1961
2008
|
- `"AI-GTM stack is clearly on your mind."`
|
|
1962
2009
|
- `"You're clearly focused on [area]."`
|
|
@@ -1965,7 +2012,9 @@ Rules:
|
|
|
1965
2012
|
- `"Saw you on [topic]."`
|
|
1966
2013
|
- `"Saw you around [topic]."`
|
|
1967
2014
|
- `"Saw you engaging with [topic]."`
|
|
1968
|
-
-
|
|
2015
|
+
- `"Saw you raise your hand for [topic], so figured this was worth sending."`
|
|
2016
|
+
- `"Figured this was worth sending."`
|
|
2017
|
+
- signal-led opener shape is a **special case**, not the default. Use it only when the archived motion truly depends on it and the line can stay natural. For LinkedIn-post-sourced campaigns, prefer `"saw you in a few conversations around [topic], so hope this is relevant"` or `"found you in a thread about [topic], so may be off, but this seemed relevant"` when referencing the source makes the outreach feel less random. Avoid activity-log phrasing such as `"you commented on..."`, `"you reacted to..."`, or `"your LinkedIn activity..."` unless the approved motion is the deliberately self-aware raise-hand line for an explicit lead-magnet comment, reply, or opt-in.
|
|
1969
2018
|
- tokenized engagement-source opener shape is BLOCKED by default:
|
|
1970
2019
|
`{{first_name}}, saw you {{engagement_context}} on {{post_context}}` reads
|
|
1971
2020
|
like surveillance unless the filled line is explicitly self-aware and
|
|
@@ -1973,11 +2022,12 @@ Rules:
|
|
|
1973
2022
|
[topic] is part of the plan`, `saw you might be interested in [topic], so hope
|
|
1974
2023
|
this is relevant`, `saw you in a few conversations around [topic], so hope this
|
|
1975
2024
|
is relevant`, `saw you in a few conversations about [topic], so may be off,
|
|
1976
|
-
but this seemed relevant`, or
|
|
1977
|
-
|
|
1978
|
-
|
|
1979
|
-
|
|
1980
|
-
|
|
2025
|
+
but this seemed relevant`, or `found you in a thread about [topic], so may be
|
|
2026
|
+
off, but this seemed relevant`. Use the self-aware raise-hand shapes only when
|
|
2027
|
+
the source was an explicit lead-magnet comment, reply, or opt-in: `saw you raise
|
|
2028
|
+
your hand for [topic], so figured this was (hopefully) worth sending` or `saw you
|
|
2029
|
+
raise your hand for [topic] (creepy to reach out based on that, i know) - but
|
|
2030
|
+
this felt too on the nose to ignore`. Do not use the longer `you might not remember the thread...` shape;
|
|
1981
2031
|
if the concise source bridge still feels awkward, omit the engagement reference.
|
|
1982
2032
|
- do not describe the sender/client in third person inside the outbound message.
|
|
1983
2033
|
`p.s. Saju's angle is...`, `Christian's angle is...`, `[sender]'s approach
|
|
@@ -2570,7 +2620,7 @@ REPLY-style copy when the motion clearly matches a tighter approved pattern.
|
|
|
2570
2620
|
Primary approved references are:
|
|
2571
2621
|
|
|
2572
2622
|
- sellable.dev
|
|
2573
|
-
- Hey Digital
|
|
2623
|
+
- Hey Digital / HeyDigital
|
|
2574
2624
|
- Galley
|
|
2575
2625
|
- Clover
|
|
2576
2626
|
- Persona
|