@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.
@@ -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.
package/dist/index-dev.js CHANGED
File without changes
package/dist/index.js CHANGED
File without changes
@@ -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.204",
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",
@@ -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
@@ -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."` or `"saw you in a few conversations around [topic], so hope this is relevant."` Translate the signal into natural buyer context or omit it.
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
- - `mcp/sellable/skills/create-campaign/references/ai-native-tokens.md`
152
- - `mcp/sellable/skills/create-campaign/references/token-fill-examples.md`
153
- - `mcp/sellable/skills/create-campaign-v2/references/gold-standard-runtime-message-pack.md`
154
- - `mcp/sellable/skills/create-campaign-v2/references/validation-criteria.md`
155
- - `mcp/sellable/skills/create-campaign-v2/references/thomas-revision-filters.md`
156
- - `mcp/sellable/skills/create-campaign-v2/references/gold-standard-message-patterns.md`
157
- - `mcp/sellable/skills/create-campaign-v2/references/gold-standard-message-examples.md`
158
- - `mcp/sellable/skills/create-campaign-v2/references/gold-standard-message-validation-example.md`
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
- - `saw you raise your hand for {{signal_topic}}, so figured this was (hopefully) worth sending` only when the engagement signal is the actual source
343
- - `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 engagement signal is the actual source and the sender's voice can carry the cheekier aside
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}}, saw you raise your hand for [topic], so figured this was (hopefully) worth sending.`
1705
- - `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.`
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
- - 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"` 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.
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 one of the self-aware raise-hand shapes when the source is the
1977
- actual reason for the note: `saw you raise your hand for [topic], so figured
1978
- this was (hopefully) worth sending` or `saw you raise your hand for [topic]
1979
- (creepy to reach out based on that, i know) - but this felt too on the nose to
1980
- ignore`. Do not use the longer `you might not remember the thread...` shape;
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