@sellable/mcp 0.1.212 → 0.1.214
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/README.md +7 -7
- package/agents/post-find-leads-message-scout.md +176 -134
- package/dist/engage-memory.js +0 -5
- package/dist/identity-memory.js +0 -4
- package/dist/tools/engage-memory.js +2 -2
- package/dist/tools/leads.js +7 -3
- package/dist/tools/prompts.js +18 -12
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +11 -12
- package/skills/create-campaign/context/learnings.md +1 -1
- package/skills/create-campaign/references/brief-template.md +2 -2
- package/skills/create-campaign-brief/references/brief-template.md +2 -2
- package/skills/create-campaign-brief/references/draft-lifecycle.md +1 -1
- package/skills/create-campaign-brief/references/examples/briefs/gelee.md +2 -2
- package/skills/create-campaign-brief/references/examples/briefs/superpower.md +41 -28
- package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +27 -36
- package/skills/create-campaign-v2/SKILL.md +16 -9
- package/skills/create-campaign-v2/core/auto-execute.README.md +11 -11
- package/skills/create-campaign-v2/core/auto-execute.yaml +4 -4
- package/skills/create-campaign-v2/core/flow.v2.json +1 -1
- package/skills/create-campaign-v2/references/ai-tells.md +54 -19
- package/skills/create-campaign-v2/references/approval-gate-framing.md +10 -10
- package/skills/create-campaign-v2/references/escalation-ladder.md +3 -3
- package/skills/create-campaign-v2/references/final-handoff-contract.md +3 -3
- package/skills/create-campaign-v2/references/gold-standard-message-examples.md +295 -226
- package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +48 -9
- package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +4 -4
- package/skills/create-campaign-v2/references/lead-validation-preview.md +1 -1
- package/skills/create-campaign-v2/references/parallel-critique-protocol.md +10 -10
- package/skills/create-campaign-v2/references/sample-validation-loop.md +3 -3
- package/skills/create-campaign-v2/references/{thomas-revision-filters.md → sellable-cleanup-rules.md} +29 -19
- package/skills/create-campaign-v2/references/step-15-re-cascade.md +1 -1
- package/skills/create-campaign-v2/references/thomas-variant-selection.md +1 -1
- package/skills/create-campaign-v2/references/validation-criteria.md +24 -18
- package/skills/create-campaign-v2-tail/SKILL.md +7 -7
- package/skills/create-campaign-v2-validation/SKILL.md +23 -7
- package/skills/create-post/SKILL.md +27 -27
- package/skills/engage/SKILL.md +12 -12
- package/skills/engage/core/README.md +14 -14
- package/skills/find-leads/SKILL.md +1 -1
- package/skills/generate-messages/SKILL.md +305 -147
- package/skills/interview/SKILL.md +24 -24
- package/skills/interview/references/legacy-linkedin-interview.md +12 -12
- package/skills/interview/references/reference-curation.md +4 -4
- package/skills/interview/references/voice-capture-method.md +1 -1
- package/skills/load-voice/SKILL.md +21 -25
- package/skills/research/SKILL.md +1 -1
- package/skills/research/config.json +9 -0
|
@@ -6,10 +6,11 @@ visibility: internal
|
|
|
6
6
|
|
|
7
7
|
# Generate Messages
|
|
8
8
|
|
|
9
|
-
You craft messages in
|
|
9
|
+
You craft row-level messages in two active modes:
|
|
10
10
|
|
|
11
11
|
- live campaign mode for selected leads in a real campaign table
|
|
12
|
-
- caller-declared DRY MODE for
|
|
12
|
+
- caller-declared DRY MODE for offline validation artifacts before any live
|
|
13
|
+
campaign exists
|
|
13
14
|
|
|
14
15
|
## Tools
|
|
15
16
|
|
|
@@ -28,37 +29,35 @@ You craft messages in one of two modes:
|
|
|
28
29
|
|
|
29
30
|
### Mode 0: Message Drafting Branch
|
|
30
31
|
|
|
31
|
-
Use
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
- campaign
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
- `
|
|
43
|
-
|
|
44
|
-
|
|
32
|
+
Use `generate-messages` for the campaign workflow's live template
|
|
33
|
+
recommendation branch after the source list is copied into the campaign table
|
|
34
|
+
and the first non-empty execution slice exists. This is not the row-cell
|
|
35
|
+
generation path. Before drafting, that branch must also load the required
|
|
36
|
+
message assets through Sellable MCP tools:
|
|
37
|
+
|
|
38
|
+
- `create-campaign-v2/references/gold-standard-message-examples.md`
|
|
39
|
+
- `create-campaign-v2/references/gold-standard-message-patterns.md`
|
|
40
|
+
- `create-campaign-v2/references/ai-tells.md`
|
|
41
|
+
- `create-campaign-v2/references/sellable-cleanup-rules.md`
|
|
42
|
+
- `create-campaign/references/ai-native-tokens.md`
|
|
43
|
+
- `create-campaign/references/token-fill-examples.md`
|
|
44
|
+
|
|
45
|
+
After candidate generation and revision, and before returning `ready`, load
|
|
46
|
+
`create-campaign-v2-validation` through Sellable MCP as the final gate.
|
|
47
|
+
|
|
48
|
+
Never reconstruct that branch from `brief.md`, `lead-review.md`,
|
|
49
|
+
`lead-sample.json`, `lead-filter.md`, `message-validation.md`, local files, or
|
|
50
|
+
direct database reads. If any required message asset cannot be loaded through MCP
|
|
51
|
+
before drafting, return `blocked` or `retry-needed`. If the validation prompt
|
|
52
|
+
cannot be loaded after generation, or the candidate fails that final gate, return
|
|
53
|
+
`blocked` or `retry-needed`.
|
|
45
54
|
|
|
46
55
|
Reject the branch as blocked if the campaign id, selected lead list, workflow
|
|
47
|
-
table, or
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
the `mcp/sellable/skills/...` strings are asset identifiers, not local files.
|
|
53
|
-
Do not use shell commands, local `Read`, `rg`, `cat`, `wc`, plugin-cache paths,
|
|
54
|
-
repo paths, or `/Users/...` paths to load them. If a required asset cannot be
|
|
55
|
-
loaded through the MCP asset loader, return `blocked` or `retry-needed` instead
|
|
56
|
-
of drafting from memory.
|
|
57
|
-
|
|
58
|
-
Return message-draft output only: template recommendation, token fill rules,
|
|
59
|
-
rendered sample, concerns, status, basis token, output timestamp/hash, and error or
|
|
60
|
-
retry detail. Do not write message cells, enrich rows, update the campaign
|
|
61
|
-
brief, attach sequence, or imply send readiness from this branch.
|
|
56
|
+
table, or initial execution-slice rows do not match. Return message-draft output
|
|
57
|
+
only: template recommendation, token fill rules, rendered good sample, status,
|
|
58
|
+
basis token, output timestamp/hash, and blocked/retry detail when applicable.
|
|
59
|
+
Do not write message cells, enrich rows, update the campaign brief, attach a
|
|
60
|
+
sequence, or imply send readiness from this branch.
|
|
62
61
|
|
|
63
62
|
### Mode 1: Live Campaign Mode
|
|
64
63
|
|
|
@@ -92,18 +91,18 @@ to live mode drafts, with live-mode-specific allowances:
|
|
|
92
91
|
- personalization from research is allowed, but it does not replace the
|
|
93
92
|
"what the product IS" / "what it DOES" anchors
|
|
94
93
|
- save behavior and calibration loop follow the live-mode workflow below,
|
|
95
|
-
but the drafted message itself is subject to the same
|
|
94
|
+
but the drafted message itself is subject to the same Sellable cleanup
|
|
96
95
|
filters as dry mode
|
|
97
96
|
|
|
98
97
|
### Mode 2: Caller-Declared DRY MODE
|
|
99
98
|
|
|
100
|
-
Use this mode when the caller explicitly says `DRY MODE`, `
|
|
99
|
+
Use this mode when the caller explicitly says `DRY MODE`, `offline validation`,
|
|
101
100
|
`create-campaign-v2`, or provides:
|
|
102
101
|
|
|
103
102
|
- `brief.md`
|
|
104
103
|
- `lead-sample.json`
|
|
105
|
-
- `lead-filter.md` when available. In the
|
|
106
|
-
|
|
104
|
+
- `lead-filter.md` when available. In the campaign workflow's post-lead
|
|
105
|
+
workstream, message generation may start before
|
|
107
106
|
`lead-filter.md` exists so it can prepare proof inventory, token strategy,
|
|
108
107
|
and candidate angles while filter-leads runs.
|
|
109
108
|
|
|
@@ -139,49 +138,87 @@ Required dry-mode contract:
|
|
|
139
138
|
If the dry-mode response is missing the no-mutation preamble, treat that as a
|
|
140
139
|
hard failure and revise the output before returning it.
|
|
141
140
|
|
|
142
|
-
##
|
|
141
|
+
## Offline Validation
|
|
143
142
|
|
|
144
143
|
Dry mode validates message quality before campaign mint.
|
|
145
144
|
|
|
146
|
-
Read
|
|
145
|
+
Read these campaign inputs:
|
|
147
146
|
|
|
148
|
-
-
|
|
149
|
-
-
|
|
150
|
-
-
|
|
151
|
-
-
|
|
152
|
-
-
|
|
153
|
-
-
|
|
154
|
-
-
|
|
147
|
+
- `~/.sellable/configs/core/about-me.md`
|
|
148
|
+
- `~/.sellable/configs/core/my-company.md`
|
|
149
|
+
- `~/.sellable/configs/core/context-modes.md`
|
|
150
|
+
- `~/.sellable/configs/core/proof-ledger.md`
|
|
151
|
+
- `~/.sellable/configs/core/wins-ledger.md`
|
|
152
|
+
- `~/.sellable/configs/core/anti-ai-writing-style.md`
|
|
153
|
+
- `~/.sellable/configs/writing/outbound.md` and legacy `styleguide-core.md` as fallback/source material when present
|
|
155
154
|
- `brief.md`
|
|
156
155
|
- `lead-sample.json` from the find-leads step; this is the only allowed sample
|
|
157
156
|
source for dry-mode message generation
|
|
158
157
|
- `lead-filter.md` when present. If it is absent because the caller launched
|
|
159
158
|
prospect setup workstreams in parallel, start the prep/candidate stages and then
|
|
160
159
|
reconcile before final `message-validation.md`.
|
|
160
|
+
## Reference Asset Loading (do this before drafting)
|
|
161
|
+
|
|
162
|
+
Do not draft from this prompt alone. The full `generate-messages` prompt is
|
|
163
|
+
only the contract; the reference assets below are the evidence and examples
|
|
164
|
+
that define the desired output. Before writing angle drafts, you MUST load every
|
|
165
|
+
required pre-draft reference below with `mcp__sellable__get_subskill_asset`.
|
|
166
|
+
This is the required pre-draft reference pack for Mode 0 message drafting.
|
|
167
|
+
This is a hard gate: if the required pre-draft assets are not loaded,
|
|
168
|
+
return `blocked` / `retry-needed` instead of drafting. Write a short
|
|
169
|
+
internal `Reference Asset Loading` note naming each loaded asset and whether it
|
|
170
|
+
was required pre-draft, dry-mode-only, or token-rules-only. Do not
|
|
171
|
+
bulk-load the conditional references unless their trigger applies or the caller
|
|
172
|
+
explicitly asks for maximum context over speed.
|
|
173
|
+
|
|
174
|
+
Use `mcp__sellable__get_subskill_asset` for packaged assets:
|
|
175
|
+
|
|
176
|
+
| Group | Asset to load | Job |
|
|
177
|
+
| --- | --- | --- |
|
|
178
|
+
| Always load before drafting | `subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-examples.md"` | Active line-level gold pack. Full archive quality bar: exact motion examples, hard rules, and transfer limits. Use it to choose 1 primary example, not to recolor copy. |
|
|
179
|
+
| 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. |
|
|
180
|
+
| 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. |
|
|
181
|
+
| Load before approval / final pass | `subskillName: "create-campaign-v2", assetPath: "references/sellable-cleanup-rules.md"` | Substance filters: earned-right, presumption, vague proof, read-as-1:1, founder-origin coherence, anti-talk-at, AI-tell filter, line continuity, PS shape, and proof safety. |
|
|
182
|
+
| 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. Always load before reusable template/token rules. |
|
|
183
|
+
| 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. Always load before reusable template/token rules. |
|
|
184
|
+
| 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. |
|
|
185
|
+
| Dry-mode artifact output only | `subskillName: "create-campaign-v2", assetPath: "references/validation-criteria.md"` | Step-level acceptance criteria and dry-mode message validation expectations. |
|
|
186
|
+
|
|
187
|
+
Example packaged asset calls:
|
|
188
|
+
|
|
189
|
+
- `get_subskill_asset({ subskillName: "create-campaign", assetPath: "references/ai-native-tokens.md" })`
|
|
190
|
+
- `get_subskill_asset({ subskillName: "create-campaign", assetPath: "references/token-fill-examples.md" })`
|
|
191
|
+
- `get_subskill_asset({ subskillName: "create-campaign-brief", assetPath: "references/phase75-active-runtime-message-pack.md" })`
|
|
192
|
+
- `get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-examples.md" })`
|
|
193
|
+
- `get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/sellable-cleanup-rules.md" })`
|
|
194
|
+
- `get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/validation-criteria.md" })`
|
|
161
195
|
|
|
162
|
-
|
|
196
|
+
Do not satisfy the list above by searching or reading the local filesystem.
|
|
197
|
+
Path-like names in this section are package asset coordinates for MCP loading.
|
|
163
198
|
|
|
164
|
-
|
|
165
|
-
Sellable MCP asset loader in live/customer runs. Continue each asset load with
|
|
166
|
-
the returned `nextOffset` until `hasMore` is false.
|
|
199
|
+
Default load order:
|
|
167
200
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
- `
|
|
174
|
-
|
|
175
|
-
|
|
201
|
+
1. Load the **Always load before drafting** assets. Do not infer their
|
|
202
|
+
contents from this prompt; actually call `mcp__sellable__get_subskill_asset`
|
|
203
|
+
for each required asset.
|
|
204
|
+
2. Draft and run the internal Finalizer Pass.
|
|
205
|
+
3. Run the selected winner against `ai-tells.md`. This is never optional. If the
|
|
206
|
+
AI-tells catalog was not loaded or any `REJECT` tell matches, do not approve,
|
|
207
|
+
confirm, recommend, or show the template as ready; return `revise-message`.
|
|
208
|
+
4. Run the selected winner against `sellable-cleanup-rules.md` before approval,
|
|
209
|
+
`confirmed`, or template recommendation.
|
|
210
|
+
5. Load dry-mode artifact references only when writing `message-validation.md`.
|
|
176
211
|
|
|
177
|
-
Do not
|
|
178
|
-
Path-like names in this section are package asset coordinates for MCP loading.
|
|
212
|
+
Do not load retired branch/runtime packs.
|
|
179
213
|
|
|
180
214
|
### Rich Personalization Contract
|
|
181
215
|
|
|
182
216
|
The `create-campaign` asset `references/ai-native-tokens.md` is the canonical
|
|
183
217
|
spec for personalization that requires judgment. Load it before
|
|
184
218
|
writing the Token Fill Rules or any reusable template notes.
|
|
219
|
+
When token fill wording is material, use
|
|
220
|
+
`mcp/sellable/skills/create-campaign/references/token-fill-examples.md` as the
|
|
221
|
+
conditional good/bad fill reference.
|
|
185
222
|
|
|
186
223
|
- Sentence-level personalization must use AI-native bracket tokens in the
|
|
187
224
|
reusable template / token plan, not old-school field substitution. Field
|
|
@@ -218,14 +255,16 @@ winner gate**.
|
|
|
218
255
|
|
|
219
256
|
### Retrieval & motion
|
|
220
257
|
|
|
221
|
-
- treat `
|
|
222
|
-
|
|
223
|
-
- retrieve against the
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
`two options:` formatting, short
|
|
227
|
-
`p.s.` lines
|
|
228
|
-
- treat the
|
|
258
|
+
- treat `gold-standard-message-examples.md` as the canonical examples asset for
|
|
259
|
+
both primary runtime examples and conditional motion references
|
|
260
|
+
- retrieve against the primary runtime examples first, then conditional examples
|
|
261
|
+
only when the campaign motion matches
|
|
262
|
+
- use the examples for concrete formatting cues that abstract patterns may
|
|
263
|
+
flatten away: lowercase vs title case, exact `two options:` formatting, short
|
|
264
|
+
line rhythm, and load-bearing `p.s.` lines
|
|
265
|
+
- treat the examples as the **quality bar and motion reference**, not a paste
|
|
266
|
+
source. Your job is to write a new message that could plausibly belong in the
|
|
267
|
+
archive, not to recolor an existing one
|
|
229
268
|
- before choosing any example, name the **strongest true reason this buyer
|
|
230
269
|
should reply**. This is the north star: the most compelling safe mechanism,
|
|
231
270
|
proof, asset, diagnostic, offer, or buyer outcome available from the brief and
|
|
@@ -245,7 +284,7 @@ winner gate**.
|
|
|
245
284
|
packaging tools. Use them only when they make the strongest true reason more
|
|
246
285
|
compelling or easier to reply to.
|
|
247
286
|
- **exact-template preservation only applies when the archived winner is the same company as the brief** (e.g., Superposition drafting for Superposition). In that case preserve casing, spacing, CTA shape, and proof ordering, and change only the documented tokens. For every other case, match the quality bar and motion shape; do not recolor the exemplar's wording
|
|
248
|
-
- if the
|
|
287
|
+
- if the examples file shows a proven same-company or same-motion line that is
|
|
249
288
|
doing real work, do not silently flatten it away in the name of generic
|
|
250
289
|
cleanliness
|
|
251
290
|
- choose the highest-specificity validated strategy available: event-led, signal-led, job-post-led, then proof-led specialist fallback (full patterns in `gold-standard-message-patterns.md`)
|
|
@@ -348,6 +387,8 @@ artifact.**
|
|
|
348
387
|
- `saw you on {{recent_signal}}`
|
|
349
388
|
- `saw you around {{recent_signal}}`
|
|
350
389
|
- `saw you engaging with {{recent_signal}}`
|
|
390
|
+
- `saw you raise your hand for {{signal_topic}}, so figured this was worth sending`
|
|
391
|
+
- `figured this was worth sending`
|
|
351
392
|
|
|
352
393
|
Safer shapes:
|
|
353
394
|
|
|
@@ -355,25 +396,49 @@ artifact.**
|
|
|
355
396
|
- `saw you might be interested in {{signal_topic}}, so hope this is relevant`
|
|
356
397
|
- `saw you in a few conversations around {{signal_topic}}, so hope this is relevant`
|
|
357
398
|
- `saw you in a few conversations about {{signal_topic}}, so may be off, but this seemed relevant`
|
|
358
|
-
- `
|
|
359
|
-
- `
|
|
399
|
+
- `appreciate you showing some love on my post about {{signal_topic}}` only when the sender/client authored the source post and the row proves a reaction or comment
|
|
400
|
+
- `thanks for showing support on my {{signal_topic}} post` only when the sender/client authored the source post and the row proves a reaction or comment
|
|
401
|
+
- `figured this might be relevant if {{channel_context}} is becoming more of a {{workflow_context}} for {{company_context}}` as the bridge after a sender-owned post acknowledgment
|
|
402
|
+
- `may be off, but if {{workflow_signal}} is relevant to what you're working on, this might be useful`
|
|
403
|
+
- `if {{workflow_signal}} is not relevant to what you're working on, ignore me`
|
|
360
404
|
- `figured this might matter if {{workflow_signal}} is live at {{company}}`
|
|
361
405
|
- `thought of {{company}} because {{observable_signal}} points at {{problem_context}}`
|
|
362
|
-
- `
|
|
363
|
-
- `saw you raise your hand for {{signal_topic}}
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
406
|
+
- `found you in a thread about {{signal_topic}}, so may be off, but this seemed relevant`
|
|
407
|
+
- `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`.
|
|
408
|
+
- `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
|
|
409
|
+
|
|
410
|
+
For sender-owned LinkedIn-post-sourced campaigns, it is acceptable to thank
|
|
411
|
+
the recipient for showing some love/support on the sender's post when the row
|
|
412
|
+
proves a reaction or comment. Keep it first-person, light, and non-assumptive:
|
|
413
|
+
`appreciate you showing some love on my post about {{signal_topic}}` is
|
|
414
|
+
acceptable; do not say `you commented` unless the row proves comment text.
|
|
415
|
+
Do not let the acknowledgment dead-end. Follow it with a soft post-topic to
|
|
416
|
+
buyer-context bridge before broad pain or product copy. Prefer:
|
|
417
|
+
`figured this might be relevant if {{channel_context}} is becoming more of a
|
|
418
|
+
{{workflow_context}} for {{company_context}}`. Avoid jumping directly from
|
|
419
|
+
`appreciate you showing some love...` into `a lot of B2B teams...` or `most
|
|
420
|
+
teams...`; that transition reads stitched together instead of human.
|
|
421
|
+
Every following line must cash the previous line: post support -> why the
|
|
422
|
+
topic may matter now -> what the product/problem has to do with that topic.
|
|
423
|
+
If the product/problem line would read the same after deleting the source
|
|
424
|
+
acknowledgment and bridge, the connection is fake; rewrite or cut until the
|
|
425
|
+
line-to-line chain is real.
|
|
426
|
+
For third-party LinkedIn-post-sourced campaigns (commenters, reactors, lead
|
|
427
|
+
magnet replies, or scraped conversations), it is acceptable to reference the
|
|
367
428
|
conversation when it explains why the note exists. Keep it topic-level, not
|
|
368
429
|
activity-log-level: `saw you in a few conversations around
|
|
369
430
|
{{signal_topic}}, so hope this is relevant` is acceptable; `saw you
|
|
370
431
|
commented on {{post_context}}` and `your LinkedIn activity around...` are
|
|
371
|
-
not.
|
|
432
|
+
not. Reserve `raise your hand` phrasing for explicit lead-magnet comments,
|
|
433
|
+
replies, or opt-ins. For ordinary thread discovery, use `saw you in a few
|
|
434
|
+
conversations around {{signal_topic}}...` or `found you in a thread about
|
|
435
|
+
{{signal_topic}}...`.
|
|
372
436
|
|
|
373
437
|
Keep the apologetic nature, but aim it at uncertainty, not surveillance.
|
|
374
438
|
Good: `saw you in a few conversations about outbound, so may be off, but
|
|
375
|
-
this seemed relevant`, `may be off, but if outbound is
|
|
376
|
-
|
|
439
|
+
this seemed relevant`, `may be off, but if outbound is relevant to what
|
|
440
|
+
you're working on...`, `if this is not relevant to your outbound workflow,
|
|
441
|
+
ignore me`, `hope
|
|
377
442
|
this is relevant if...`. Bad: `your role at {{company}} looked close...`,
|
|
378
443
|
because it asserts fit from a title and tells the buyer about themselves.
|
|
379
444
|
|
|
@@ -402,7 +467,7 @@ Selected Winner, check it against these gates:
|
|
|
402
467
|
- **No title-fit assertion:** do not write `your [role] role at [company]
|
|
403
468
|
looked close to this problem`. A title/company can be the private reason you
|
|
404
469
|
selected the row, but the buyer-facing line should stay conditional:
|
|
405
|
-
`may be off, but if [workflow] is
|
|
470
|
+
`may be off, but if [workflow] is relevant to what you're working on...`.
|
|
406
471
|
- **Swap test:** if another founder/operator could receive the line after only
|
|
407
472
|
changing names and companies, cut it or make the bridge more specific.
|
|
408
473
|
- **Tell-about-themselves test:** if the line merely reports a fact the buyer
|
|
@@ -421,7 +486,9 @@ Better:
|
|
|
421
486
|
- `saw you in a few conversations around international growth, so hope this is relevant.`
|
|
422
487
|
- `saw you in a few conversations around LinkedIn outreach, so hope this is relevant.`
|
|
423
488
|
- `saw you in a few conversations about LinkedIn outreach, so may be off, but this seemed relevant.`
|
|
424
|
-
- `
|
|
489
|
+
- `appreciate you showing some love on my post about GTM engineering.`
|
|
490
|
+
- `figured this might be relevant if LinkedIn is becoming more of a GTM channel for {{company_context}}.`
|
|
491
|
+
- `may be off, but if outbound is relevant to what you're working on, this might be useful.`
|
|
425
492
|
- `figured this might matter if you're testing outbound by market.`
|
|
426
493
|
|
|
427
494
|
### Angle drafting & finalizer
|
|
@@ -664,18 +731,17 @@ help...` or `built for [buyer] to...`. Do not overuse generic solved-state
|
|
|
664
731
|
solved, or fail to connect to the specific sample row. Prefer a concrete
|
|
665
732
|
row-fit line, a useful artifact, or a buyer-owned current-state observation
|
|
666
733
|
that the recipient can understand without reading the brief.
|
|
667
|
-
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
paragraph.
|
|
734
|
+
- run the parallel action formatting check when the winner has 3 adjacent
|
|
735
|
+
product actions, outputs, mechanics, or objection removers. If the lines
|
|
736
|
+
repeat the same subject pattern (`It drafts...` / `It adapts...` /
|
|
737
|
+
`It helps...`) and each line is a discrete function with no narrative proof
|
|
738
|
+
clause, prefer a compact `-` bullet stack because it is easier to scan on
|
|
739
|
+
mobile. Example:
|
|
740
|
+
`It helps your team:` followed by `- Draft posts...`, `- Adapt them...`,
|
|
741
|
+
`- Keep showing up...`. Do not force bullets when there are only 1-2
|
|
742
|
+
actions, one line needs narrative context, the bullets feel like a landing
|
|
743
|
+
page, or the paragraph version is clearly more human and still scans cleanly.
|
|
744
|
+
This is a formatting preference, not a message-strategy gate.
|
|
679
745
|
- if one finalist already holds the best of every piece, the winner may
|
|
680
746
|
equal it — name which one and on which axis it won (relevance,
|
|
681
747
|
distinctiveness, proof, coherence, readability)
|
|
@@ -740,12 +806,23 @@ Finalizer preference when multiple candidates are otherwise comparable:
|
|
|
740
806
|
supports
|
|
741
807
|
- if an A/B CTA adds ceremony without increasing buyer confidence, cut
|
|
742
808
|
it back to one ask
|
|
809
|
+
- if a selected template or gold-standard influence ends with a
|
|
810
|
+
non-question CTA statement, do not preserve the surface wording. Preserve
|
|
811
|
+
the buyer promise and rewrite the CTA as one concrete yes/no question.
|
|
812
|
+
Example: `easiest way to see if it's worth a look is to try it with one of
|
|
813
|
+
your actual menus. happy to set that up or I can send a 2-min video
|
|
814
|
+
instead.` should become a single question that names the useful object, such
|
|
815
|
+
as `open to seeing what one real menu would look like in the product?`
|
|
743
816
|
- do not default to founder-to-founder, MD-to-MD, doctor-to-doctor,
|
|
744
817
|
peer-call, compare-notes, or similar identity-call framing. Those CTAs
|
|
745
818
|
are usually weaker than naming the useful thing the buyer gets. Use them
|
|
746
819
|
only when the user explicitly chose that route or the brief makes that
|
|
747
|
-
peer-call motion the approved offer. Even then, the
|
|
748
|
-
|
|
820
|
+
peer-call motion the approved offer. Even then, preserve the intent, not the
|
|
821
|
+
phrase. Translate `compare notes` into a concrete CTA that names the topic,
|
|
822
|
+
workflow, artifact, preview, teardown, or working session. Prefer shapes like
|
|
823
|
+
`Open to a quick call on how {{company_or_team}} might turn LinkedIn content
|
|
824
|
+
into pipeline?`. Do not use `Open to compare notes?` or `Open to comparing
|
|
825
|
+
notes on...`.
|
|
749
826
|
- when the message is selling or introducing a product, make the product
|
|
750
827
|
plain before asking for time, but do not make the opener sound like a
|
|
751
828
|
homepage definition. The reader should be able to answer "what is this?"
|
|
@@ -842,6 +919,9 @@ For every line in the selected winner, ask:
|
|
|
842
919
|
- Would removing this line make the prospect less likely to reply?
|
|
843
920
|
- Does this line make the reply reason clearer, more believable, or easier
|
|
844
921
|
to act on?
|
|
922
|
+
- Does this line follow from the line before it and make the next line feel
|
|
923
|
+
earned? If two adjacent lines could be swapped, deleted, or joined with
|
|
924
|
+
`anyway`, the transition is fake. Rewrite the bridge or cut the orphan line.
|
|
845
925
|
- Is this line carrying one of the core jobs: buyer gap / pain, product
|
|
846
926
|
mechanism, concrete output, or CTA?
|
|
847
927
|
- Does this line repeat the same nouns, proof, or mechanism already stated
|
|
@@ -902,7 +982,7 @@ Message-validation artifact budget:
|
|
|
902
982
|
|
|
903
983
|
**Substance-filter gate before the Finalizer Pass:** each candidate is
|
|
904
984
|
checked against the 8 Substance Filters in
|
|
905
|
-
`../create-campaign-v2/references/
|
|
985
|
+
`../create-campaign-v2/references/sellable-cleanup-rules.md` (Earned-
|
|
906
986
|
right, Presumption, Vague-proof, Read-as-1:1, Founder-origin coherence,
|
|
907
987
|
Anti-AI-tell, Anti-talk-at, Anti-self-introduction). A candidate that
|
|
908
988
|
fails any filter is marked BLOCKED in `message-validation.md` (cite
|
|
@@ -955,7 +1035,10 @@ Before drafting, answer these five questions explicitly:
|
|
|
955
1035
|
4. **What proof makes it believable?** Pick the one proof beat that
|
|
956
1036
|
answers the buyer's biggest skepticism.
|
|
957
1037
|
5. **What is the lowest-friction true next step?** Use only a next step
|
|
958
|
-
supported by the inputs.
|
|
1038
|
+
supported by the inputs. If the campaign brief explicitly names a CTA
|
|
1039
|
+
motion, preserve it unless it fails truth, clarity, pressure, or safety
|
|
1040
|
+
gates. Improve the CTA by making the object concrete before replacing the
|
|
1041
|
+
motion.
|
|
959
1042
|
|
|
960
1043
|
Then choose the exact element pool that angle drafts are allowed to use:
|
|
961
1044
|
|
|
@@ -996,6 +1079,20 @@ Return `revise-message` with the missing strategy pieces.
|
|
|
996
1079
|
|
|
997
1080
|
CTA and PS are tools, not defaults.
|
|
998
1081
|
|
|
1082
|
+
The final CTA must be a question unless the user explicitly approved a
|
|
1083
|
+
non-question outbound motion. Template preservation does not override this. If
|
|
1084
|
+
the best draft or primary example has a statement CTA (`happy to set that up`,
|
|
1085
|
+
`I can send...`, `let me know`, `worth a look is...`), run a CTA normalization
|
|
1086
|
+
pass before selecting the winner:
|
|
1087
|
+
|
|
1088
|
+
- keep the useful object the buyer gets
|
|
1089
|
+
- cut weak second options unless both choices are independently valuable
|
|
1090
|
+
- make the ask one self-contained yes/no question on its own line
|
|
1091
|
+
- preserve the campaign's approved intent, not the exact words
|
|
1092
|
+
- write the question from the campaign's real object and product category; do
|
|
1093
|
+
not hard-code wording from a gold example when the buyer input, artifact,
|
|
1094
|
+
preview, or product is different
|
|
1095
|
+
|
|
999
1096
|
CTA options must be scored before drafting. Use `two options:` only when
|
|
1000
1097
|
both choices are genuinely useful and supported:
|
|
1001
1098
|
|
|
@@ -1006,6 +1103,23 @@ both choices are genuinely useful and supported:
|
|
|
1006
1103
|
Do not add option B just to mimic a gold standard. If the second option
|
|
1007
1104
|
is weak, use one CTA.
|
|
1008
1105
|
|
|
1106
|
+
CTA precedence:
|
|
1107
|
+
|
|
1108
|
+
1. If the campaign brief explicitly names a CTA motion, preserve the intent of
|
|
1109
|
+
that motion unless it is unsupported, too high-pressure, unsafe, or too vague
|
|
1110
|
+
to make concrete.
|
|
1111
|
+
2. If preserving it, make the object specific in the same line so the buyer
|
|
1112
|
+
knows what they are agreeing to discuss, see, or get.
|
|
1113
|
+
3. Replace it only when the brief CTA cannot pass truth, clarity, pressure, or
|
|
1114
|
+
safety gates.
|
|
1115
|
+
|
|
1116
|
+
Treat `compare notes` as shorthand for a peer conversation, not as buyer-facing
|
|
1117
|
+
copy. The phrase itself is blocked in selected winners, including `Open to
|
|
1118
|
+
compare notes?`, `Founder-to-founder compare notes?`, and `Open to comparing
|
|
1119
|
+
notes on...`. If the brief selected that intent, translate it into a concrete
|
|
1120
|
+
quick-call or working-session CTA, e.g. `Open to a quick call on how
|
|
1121
|
+
{{company_or_team}} might turn LinkedIn content into pipeline?`.
|
|
1122
|
+
|
|
1009
1123
|
For artifact/sample offers, the CTA should usually be one self-contained
|
|
1010
1124
|
yes/no question that names the concrete thing the buyer gets. Do not split
|
|
1011
1125
|
the ask into a setup sentence plus a vague question.
|
|
@@ -1063,11 +1177,17 @@ message / artifact] was made with [product].`
|
|
|
1063
1177
|
lowers "is this real?" / "will this company be around?" risk without
|
|
1064
1178
|
bloating the body. Its job can be legitimacy, not direct persuasion:
|
|
1065
1179
|
it answers whether the company and offer are real enough to take a look.
|
|
1066
|
-
It must still tie the backing to the buyer
|
|
1067
|
-
|
|
1180
|
+
It must still tie the backing to the buyer outcome instead of flashing a
|
|
1181
|
+
badge or describing the seller's focus. Good shapes:
|
|
1068
1182
|
`p.s. we're YC-backed and built for [specific buyer segment] trying to
|
|
1069
|
-
[buyer outcome].` or `p.s. we're backed by [credible
|
|
1070
|
-
[
|
|
1183
|
+
[buyer outcome].` or `p.s. we're backed by [credible backers] to help
|
|
1184
|
+
[buyer segment] turn [buyer-owned workflow/channel] into [buyer outcome].`
|
|
1185
|
+
Keep it short and test it against no-PS. Do not use
|
|
1186
|
+
`focused on [category/problem]` in prospect-facing copy; translate company
|
|
1187
|
+
focus into the buyer's problem/outcome, or omit the PS. For a
|
|
1188
|
+
LinkedIn-content motion only, a good translation is:
|
|
1189
|
+
`p.s. we're backed by operators from [credible companies] to help teams
|
|
1190
|
+
turn LinkedIn content into dependable pipeline.`
|
|
1071
1191
|
|
|
1072
1192
|
If YC, notable backing, funding, or named investor proof is present AND
|
|
1073
1193
|
the buyer is in healthcare, financial services, security, enterprise, or
|
|
@@ -1118,7 +1238,7 @@ a weak body. If the PS sounds like internal reasoning, delete it. Source
|
|
|
1118
1238
|
disclaimers such as `p.s. if the source thread was just casual reading, ignore
|
|
1119
1239
|
me` are BLOCKED; if the source is too weak to stand in the opener/body, omit it.
|
|
1120
1240
|
A relevance-risk PS is allowed when it names uncertainty without narrating the
|
|
1121
|
-
source: `p.s. if this is
|
|
1241
|
+
source: `p.s. if this is not relevant to your outbound workflow, ignore me.`
|
|
1122
1242
|
|
|
1123
1243
|
### Raw proof translation test (HARD INVARIANT)
|
|
1124
1244
|
|
|
@@ -1189,7 +1309,7 @@ Truth is not enough. The line must do a job for the prospect.
|
|
|
1189
1309
|
|
|
1190
1310
|
### Single-send-unit gate (HARD INVARIANT)
|
|
1191
1311
|
|
|
1192
|
-
|
|
1312
|
+
Offline-validation message generation approves the **first outbound
|
|
1193
1313
|
send only**. The Selected Winner must be exactly one send unit for one channel:
|
|
1194
1314
|
one INVITE, one INMAIL_OPEN / INMAIL_CLOSED body plus optional subject, or one
|
|
1195
1315
|
DM body when the campaign explicitly starts with DM.
|
|
@@ -1584,6 +1704,13 @@ teardown`, `record a video`, or similar assets are BLOCKED unless the
|
|
|
1584
1704
|
input says that exact next step exists. When unsure, ask for the
|
|
1585
1705
|
lowest-friction true next step from the brief, such as sending the
|
|
1586
1706
|
setup link, next step, or a short walkthrough.
|
|
1707
|
+
- **Brief CTA obedience:** if the brief explicitly names a CTA motion, the
|
|
1708
|
+
selected winner must either preserve that motion's intent with concrete
|
|
1709
|
+
specificity or explain why truth, clarity, pressure, or safety gates forced a
|
|
1710
|
+
replacement.
|
|
1711
|
+
If the brief uses `compare notes`, do not put that phrase in buyer-facing copy.
|
|
1712
|
+
Translate it into a concrete quick-call or working-session CTA that names the
|
|
1713
|
+
topic or workflow.
|
|
1587
1714
|
- **CTA clarity:** if the product category is unfamiliar, the CTA must
|
|
1588
1715
|
make the preview easy to imagine in one short phrase. Avoid vague asks
|
|
1589
1716
|
like `send the setup link` unless the message has already made that
|
|
@@ -1598,8 +1725,11 @@ teardown`, `record a video`, or similar assets are BLOCKED unless the
|
|
|
1598
1725
|
artifact / preview] you can [use/check/compare]?`.
|
|
1599
1726
|
- **CTA specificity:** generic CTAs like `compare notes`, `worth a chat`,
|
|
1600
1727
|
`open to a call`, or `quick walkthrough` are BLOCKED unless the same
|
|
1601
|
-
line names the specific thing the buyer will
|
|
1602
|
-
next step must be easy to picture.
|
|
1728
|
+
line names the specific thing the buyer will discuss, see, or get. The
|
|
1729
|
+
next step must be easy to picture. `Open to a quick call on how
|
|
1730
|
+
{{company_or_team}} might turn LinkedIn content into pipeline?` passes
|
|
1731
|
+
because the topic is concrete; `Open to compare notes?` fails because the
|
|
1732
|
+
object is missing and the phrase is stale.
|
|
1603
1733
|
- **Preview CTA wording:** when the CTA is a preview, prefer `open to
|
|
1604
1734
|
seeing...` over `worth seeing...` unless the chosen gold motion strongly
|
|
1605
1735
|
supports `worth`. `Open to seeing what this would look like for your own
|
|
@@ -1617,13 +1747,16 @@ PO from your inbox?` beats `worth 15 min to compare notes?` because the
|
|
|
1617
1747
|
was just casual reading, ignore me`, `only reaching out where the role and
|
|
1618
1748
|
topic looked close`, or similar sourcing-defense copy.
|
|
1619
1749
|
Relevance-risk opt-outs are allowed when they do not defend the source:
|
|
1620
|
-
`p.s. if this is
|
|
1750
|
+
`p.s. if this is not relevant to your outbound workflow, ignore me.`
|
|
1621
1751
|
- **YC / backing PS:** a PS that only says `we're YC`, `we're YC W26`,
|
|
1622
1752
|
`backed by YC`, or similar is BLOCKED as badge-flashing. If YC/backing
|
|
1623
1753
|
is used, the same sentence must either tie to the buyer segment/outcome
|
|
1624
1754
|
(`we're YC-backed and trying to help banks stop scam money before it
|
|
1625
1755
|
moves`) or materially lower commitment (`happy to send the sample
|
|
1626
1756
|
without a call first`). Prefer the buyer-outcome version when both fit.
|
|
1757
|
+
Do not write `backed by [X] and focused on [Y]`; "focused on" describes
|
|
1758
|
+
the seller. Translate it to `backed by [X] to help [buyer] [outcome]`,
|
|
1759
|
+
or choose no PS.
|
|
1627
1760
|
For high-trust or new-category offers, YC/backing should be tested as a
|
|
1628
1761
|
PS before being marked internal-only; the question is whether the PS
|
|
1629
1762
|
lowers trust risk for the buyer, not whether the body already has one
|
|
@@ -1688,8 +1821,11 @@ led to it. Acceptable openers:
|
|
|
1688
1821
|
- `Hey {{first_name}}, hope this is relevant if [buyer context] is still on your plate.`
|
|
1689
1822
|
- `Hey {{first_name}}, saw you might be interested in [topic], so hope this is relevant.`
|
|
1690
1823
|
- `Hey {{first_name}}, saw you in a few conversations around [topic], so hope this is relevant.`
|
|
1691
|
-
- `Hey {{first_name}},
|
|
1692
|
-
- `Hey {{first_name}}, saw you raise your hand for [topic]
|
|
1824
|
+
- `Hey {{first_name}}, found you in a thread about [topic], so may be off, but this seemed relevant.`
|
|
1825
|
+
- `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.
|
|
1826
|
+
- `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.
|
|
1827
|
+
- Do not use the flattened line `so figured this was worth sending`; either keep
|
|
1828
|
+
`(hopefully)` or use `so hope this is relevant`.
|
|
1693
1829
|
- `Hey {{first_name}}, pre-[product], we [did the operator-reality
|
|
1694
1830
|
thing] for [X] years; [one-line consequence].`
|
|
1695
1831
|
- `Hey {{first_name}}, building a thing for [segment] I think you'd
|
|
@@ -1900,10 +2036,18 @@ Flow skeleton (apply even when motion varies):
|
|
|
1900
2036
|
2. Pain — what's breaking now
|
|
1901
2037
|
3. **What the product IS** — one crisp sentence naming the product and what category of work it takes on. Example shape: `[Product] is [a category-noun] that [takes a specific class of work off the buyer's plate]`. When the offer is for the buyer's exact role/credential, prefer `lets you...` or `[role]s like you...` over `lets a [role]...` so the buyer does not feel treated like an outsider. Archive-anchored illustrations: Galley's "AI that reads the messiest BEOs and turns them into production-ready plans"; Revvix's "shows what's actually exploitable on your endpoints based on runtime activity".
|
|
1902
2038
|
4. **What the product DOES** — one action per line. Three actions maximum. Choose the rendering by a **concrete test**, not a feeling:
|
|
1903
|
-
- **
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
2039
|
+
- **Prefer bullets when 3 adjacent action lines are maximally parallel**:
|
|
2040
|
+
each starts with the same subject pattern (e.g. `It drafts...` /
|
|
2041
|
+
`It adapts...` / `It helps...`), each is a discrete product function,
|
|
2042
|
+
and none carries narrative context or proof. Use a setup line plus short
|
|
2043
|
+
`-` bullets, e.g. `It helps your team:` then `- Draft posts...`,
|
|
2044
|
+
`- Adapt them...`, `- Keep showing up...`.
|
|
2045
|
+
- **Use one-line paragraphs** when there are only 1-2 actions, at least one
|
|
2046
|
+
action carries a short narrative clause, bullets would feel like a landing
|
|
2047
|
+
page, or the paragraph version is clearly more human and still scans
|
|
2048
|
+
cleanly.
|
|
2049
|
+
- "Conversational motion" alone is **not** a reason to avoid bullets when
|
|
2050
|
+
all 3 action lines repeat the same `It X` structure.
|
|
1907
2051
|
- Never stack the three actions into one glued comma-list sentence.
|
|
1908
2052
|
5. Deployment ease — one short paragraph
|
|
1909
2053
|
6. CTA — useful next step, binary when the brief supports it
|
|
@@ -1912,7 +2056,9 @@ Flow skeleton (apply even when motion varies):
|
|
|
1912
2056
|
Rules within the flow:
|
|
1913
2057
|
|
|
1914
2058
|
- **banned**: comma-stacking three actions into one glued sentence (e.g. `"order intake, inventory sync, and reorder timing"` glued together). Split into one action per line.
|
|
1915
|
-
- **preferred**: one action per line — as one-line paragraphs or as a bullet
|
|
2059
|
+
- **preferred**: one action per line — as one-line paragraphs or as a bullet
|
|
2060
|
+
list, whichever reads cleaner. Use bullets as a mobile readability preference
|
|
2061
|
+
for 3 repeated-subject product actions, not as a blanket hard gate.
|
|
1916
2062
|
- the "what the product IS" sentence comes **before** the action breakdown — skipping it makes the actions feel disconnected
|
|
1917
2063
|
- if the brief does not support three distinct actions, drop to two or one. Do not pad.
|
|
1918
2064
|
- if a proof sentence gets long, split the metric and the explanation into separate one-line paragraphs rather than chaining them together
|
|
@@ -1930,10 +2076,11 @@ Rules:
|
|
|
1930
2076
|
- `"Saw you might be interested in [topic], so hope this is relevant."`
|
|
1931
2077
|
- `"Saw you in a few conversations around [topic], so hope this is relevant."`
|
|
1932
2078
|
- `"Saw you in a few conversations about [topic], so may be off, but this seemed relevant."`
|
|
2079
|
+
- `"Found you in a thread about [topic], so may be off, but this seemed relevant."`
|
|
1933
2080
|
- `"Thought of {{company}} because [observable signal] points at [problem]."`
|
|
1934
2081
|
- `"Figured this might matter if [workflow] is live at {{company}}."`
|
|
1935
|
-
- `"Saw you raise your hand for [topic], so figured this was (hopefully) worth sending."`
|
|
1936
|
-
- `"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."`
|
|
2082
|
+
- `"Saw you raise your hand for [topic], so figured this was (hopefully) worth sending."` Only for explicit lead-magnet comments, replies, or opt-ins.
|
|
2083
|
+
- `"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.
|
|
1937
2084
|
- blocked signal use:
|
|
1938
2085
|
- `"AI-GTM stack is clearly on your mind."`
|
|
1939
2086
|
- `"You're clearly focused on [area]."`
|
|
@@ -1942,7 +2089,9 @@ Rules:
|
|
|
1942
2089
|
- `"Saw you on [topic]."`
|
|
1943
2090
|
- `"Saw you around [topic]."`
|
|
1944
2091
|
- `"Saw you engaging with [topic]."`
|
|
1945
|
-
-
|
|
2092
|
+
- `"Saw you raise your hand for [topic], so figured this was worth sending."`
|
|
2093
|
+
- `"Figured this was worth sending."`
|
|
2094
|
+
- 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.
|
|
1946
2095
|
- tokenized engagement-source opener shape is BLOCKED by default:
|
|
1947
2096
|
`{{first_name}}, saw you {{engagement_context}} on {{post_context}}` reads
|
|
1948
2097
|
like surveillance unless the filled line is explicitly self-aware and
|
|
@@ -1950,11 +2099,12 @@ Rules:
|
|
|
1950
2099
|
[topic] is part of the plan`, `saw you might be interested in [topic], so hope
|
|
1951
2100
|
this is relevant`, `saw you in a few conversations around [topic], so hope this
|
|
1952
2101
|
is relevant`, `saw you in a few conversations about [topic], so may be off,
|
|
1953
|
-
but this seemed relevant`, or
|
|
1954
|
-
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
2102
|
+
but this seemed relevant`, or `found you in a thread about [topic], so may be
|
|
2103
|
+
off, but this seemed relevant`. Use the self-aware raise-hand shapes only when
|
|
2104
|
+
the source was an explicit lead-magnet comment, reply, or opt-in: `saw you raise
|
|
2105
|
+
your hand for [topic], so figured this was (hopefully) worth sending` or `saw you
|
|
2106
|
+
raise your hand for [topic] (creepy to reach out based on that, i know) - but
|
|
2107
|
+
this felt too on the nose to ignore`. Do not use the longer `you might not remember the thread...` shape;
|
|
1958
2108
|
if the concise source bridge still feels awkward, omit the engagement reference.
|
|
1959
2109
|
- do not describe the sender/client in third person inside the outbound message.
|
|
1960
2110
|
`p.s. Saju's angle is...`, `Christian's angle is...`, `[sender]'s approach
|
|
@@ -2016,8 +2166,8 @@ A PS must not explain strategy, defend the pitch, narrate the source thread,
|
|
|
2016
2166
|
add a second unrelated offer, or say the quiet part out loud. Lines like `this
|
|
2017
2167
|
is not just a platform idea` and `if the source thread was just casual reading,
|
|
2018
2168
|
ignore me` are blocked because they sound like internal rationale. A plain
|
|
2019
|
-
relevance-risk opt-out such as `if this is
|
|
2020
|
-
ignore me` can stay when it lowers pressure without explaining the scrape.
|
|
2169
|
+
relevance-risk opt-out such as `if this is not relevant to your outbound
|
|
2170
|
+
workflow, ignore me` can stay when it lowers pressure without explaining the scrape.
|
|
2021
2171
|
|
|
2022
2172
|
The reader does not know who the sender's colleagues are. Dropping a bare first name with no anchor reads like a resume dump that was cut in half.
|
|
2023
2173
|
|
|
@@ -2032,7 +2182,7 @@ Rules:
|
|
|
2032
2182
|
- write the PS in a voice the reader can place:
|
|
2033
2183
|
- if the **sender is the founder/operator**, write in `I` voice. Archive anchor: Superposition's `"I placed the first engineering hire at Brex."`
|
|
2034
2184
|
- if the **sender is not the founder**, use `our CEO`, `our team`, or `we` as the anchor — never drop a bare first name with no anchor. Shape: `"Our CEO [did the prior thing that shows they understand this buyer's pain]."`
|
|
2035
|
-
- `our team` and `we` voices work well for backing, funding, or collective proof. Shape: `"Our team is backed by [investor]
|
|
2185
|
+
- `our team` and `we` voices work well for backing, funding, or collective proof. Shape: `"Our team is backed by [investor] to help [buyer segment] [buyer outcome]."`
|
|
2036
2186
|
- **default to ONE proof beat** — the single beat that most directly answers "why is this sender a fit for my specific pain?"
|
|
2037
2187
|
- a second beat is only allowed when it answers a **different objection** the buyer would actually have — not when it's merely available. Structural examples of valid second beats (objection-shaped, motion-agnostic):
|
|
2038
2188
|
- the buyer's likely concern is "does this actually work reliably" → a beat about technical depth or track record strengthens the fit
|
|
@@ -2046,14 +2196,15 @@ Rules:
|
|
|
2046
2196
|
- the proof is purely credential without a relevance hook you can write in one sentence
|
|
2047
2197
|
- the body already carries the mechanism and relevance and adding a PS would dilute rather than reinforce
|
|
2048
2198
|
- except when the PS itself is the proof/demo that makes the core claim more believable
|
|
2049
|
-
- examples of good shapes (abstract — to be instantiated from the brief's safe-claims list, not copied):
|
|
2199
|
+
- examples of good shapes (abstract — to be instantiated from the brief's safe-claims list, not copied):
|
|
2050
2200
|
- `"Our CEO [ran a comparable operation before this], so the product is built for how [buyer-specific failure mode] actually breaks."`
|
|
2051
2201
|
- `"I spent [X years] watching this exact [named handoff] fall apart at a previous role, which is why the first thing we built fixes it."`
|
|
2052
|
-
- `"Our team is backed by [named investor]
|
|
2202
|
+
- `"Our team is backed by [named investor] to help [buyer segment] [buyer outcome]."`
|
|
2053
2203
|
- examples of bad shapes (automatic revisions):
|
|
2054
2204
|
- `"Alex did X. Jordan did Y."` — bare first names with no anchor, no relevance to the buyer's pain
|
|
2055
2205
|
- `"CEO Alex, 2x founder. CTO Jordan, ex-FAANG."` — credential list, no relevance hook
|
|
2056
2206
|
- `"Our team has deep [X] and [Y] experience."` — generic, no specifics
|
|
2207
|
+
- `"We're backed by [investor] and focused on [category/problem]."` — company-focus copy; translate to buyer outcome or cut
|
|
2057
2208
|
- any PS that could be dropped without weakening the fit case — drop it instead
|
|
2058
2209
|
|
|
2059
2210
|
### Safety
|
|
@@ -2064,7 +2215,7 @@ Rules:
|
|
|
2064
2215
|
- reject personalization that cannot be traced to `lead-sample.json`
|
|
2065
2216
|
- keep proof claims inside the brief's safe-claims boundary
|
|
2066
2217
|
- use only signals validated in `lead-sample.json`
|
|
2067
|
-
- pass the
|
|
2218
|
+
- pass the Sellable cleanup rules before returning
|
|
2068
2219
|
|
|
2069
2220
|
When token sourcing is weak:
|
|
2070
2221
|
|
|
@@ -2270,7 +2421,7 @@ hiring for`
|
|
|
2270
2421
|
|
|
2271
2422
|
## Token Adherence Table
|
|
2272
2423
|
|
|
2273
|
-
| Sample | Supported Tokens Only | All Tokens Resolved | Proof Safe | Personalization Grounded |
|
|
2424
|
+
| Sample | Supported Tokens Only | All Tokens Resolved | Proof Safe | Personalization Grounded | Sellable Cleanup Rules | Result |
|
|
2274
2425
|
| ------ | --------------------- | ------------------- | ---------- | ------------------------ | -------------- | ------ |
|
|
2275
2426
|
|
|
2276
2427
|
## Message Element Plan
|
|
@@ -2388,7 +2539,7 @@ hiring for`
|
|
|
2388
2539
|
- Best CTA: Candidate [A|B|C] — reason
|
|
2389
2540
|
- Best PS / no-PS decision: Candidate [A|B|C] — reason
|
|
2390
2541
|
- Element edits made by finalizer: ...
|
|
2391
|
-
-
|
|
2542
|
+
- Parallel action formatting: bullets used | paragraphs kept | not applicable — reason
|
|
2392
2543
|
- Style consistency check: PASS | BLOCKED — reason
|
|
2393
2544
|
- Assembly note: clean combination or one candidate swept
|
|
2394
2545
|
|
|
@@ -2397,7 +2548,7 @@ hiring for`
|
|
|
2397
2548
|
- Original winner: ...
|
|
2398
2549
|
- Simplified candidate: ...
|
|
2399
2550
|
- Simplifier edits: combined lines | split dense line | preserved bullet stack | added bullet stack | none
|
|
2400
|
-
-
|
|
2551
|
+
- Parallel action formatting: preserved bullets | added bullets | paragraphs kept | not applicable — reason
|
|
2401
2552
|
- Robustness check: PASS | BLOCKED — reason
|
|
2402
2553
|
- Decision: applied | rejected
|
|
2403
2554
|
|
|
@@ -2420,6 +2571,7 @@ hiring for`
|
|
|
2420
2571
|
- Jargon / acronym exactness: PASS | BLOCKED — reason
|
|
2421
2572
|
- Style consistency: PASS | BLOCKED — reason
|
|
2422
2573
|
- CTA truth: PASS | BLOCKED — reason
|
|
2574
|
+
- Brief CTA obedience: PASS | BLOCKED | NOT APPLICABLE — reason
|
|
2423
2575
|
- CTA clarity: PASS | BLOCKED — reason
|
|
2424
2576
|
- PS restraint: PASS | BLOCKED | OMITTED — reason
|
|
2425
2577
|
- YC / backing PS: PASS | BLOCKED | OMITTED — reason
|
|
@@ -2488,7 +2640,7 @@ Automatic failures in dry mode:
|
|
|
2488
2640
|
- invented proof or personalization
|
|
2489
2641
|
- no compelling proof element despite the brief supporting one
|
|
2490
2642
|
- a CTA that depends on missing proof
|
|
2491
|
-
- copy that fails the
|
|
2643
|
+
- copy that fails the Sellable cleanup rules
|
|
2492
2644
|
- any post-accept DM, follow-up, second touch, cadence branch, or sequence copy
|
|
2493
2645
|
in the first-message validation artifact
|
|
2494
2646
|
- any mutation tool usage
|
|
@@ -2500,7 +2652,7 @@ Automatic failures in dry mode:
|
|
|
2500
2652
|
Goal: lock tone + offer with 1-3 examples before scaling.
|
|
2501
2653
|
Only hard requirement: draft at least one message before batch; saving examples is strongly recommended but optional.
|
|
2502
2654
|
|
|
2503
|
-
Before drafting, read any
|
|
2655
|
+
Before drafting, read any brief-calibration assets already present:
|
|
2504
2656
|
|
|
2505
2657
|
- the campaign brief itself
|
|
2506
2658
|
- any "Messaging Calibration" section saved back into the brief
|
|
@@ -2540,22 +2692,28 @@ too generic, diagnose the gap precisely:
|
|
|
2540
2692
|
|
|
2541
2693
|
Then tighten the brief or calibration notes before scaling.
|
|
2542
2694
|
|
|
2543
|
-
Use
|
|
2544
|
-
not already contain winning examples. Do not default to
|
|
2545
|
-
copy when the motion clearly matches a tighter
|
|
2546
|
-
references
|
|
2695
|
+
Use `gold-standard-message-examples.md` as the primary line-level source even
|
|
2696
|
+
when the brief does not already contain winning examples. Do not default to
|
|
2697
|
+
generic REPLY-style copy when the motion clearly matches a tighter approved
|
|
2698
|
+
pattern. Primary runtime references are:
|
|
2547
2699
|
|
|
2548
|
-
-
|
|
2700
|
+
- sellable.dev
|
|
2701
|
+
- Hey Digital
|
|
2549
2702
|
- Galley
|
|
2550
|
-
-
|
|
2551
|
-
-
|
|
2552
|
-
|
|
2553
|
-
|
|
2554
|
-
-
|
|
2703
|
+
- Clover
|
|
2704
|
+
- Persona
|
|
2705
|
+
|
|
2706
|
+
Use Superpower only for benefits/healthcare mechanism language and cleaned
|
|
2707
|
+
low-certainty relevance bridges. Use Galley only for matching foodservice,
|
|
2708
|
+
event/demo, or signal-led operator motions. Use Revvix / Spektion and
|
|
2709
|
+
Superposition only for explicit event/logistics or job-post/founder-hiring
|
|
2710
|
+
motions. Do not use Gelee, westpark villas, Amplify Security, or raw old-client
|
|
2711
|
+
archive examples as runtime inspiration unless the caller explicitly provides
|
|
2712
|
+
them as campaign calibration.
|
|
2555
2713
|
|
|
2556
|
-
When the brief is sparse but the motion clearly matches an
|
|
2557
|
-
borrow the closest
|
|
2558
|
-
|
|
2714
|
+
When the brief is sparse but the motion clearly matches an approved winner,
|
|
2715
|
+
borrow the closest approved shape from `gold-standard-message-examples.md`
|
|
2716
|
+
before inventing a new structure.
|
|
2559
2717
|
|
|
2560
2718
|
### Single Row
|
|
2561
2719
|
|
|
@@ -2639,12 +2797,12 @@ research → condense → 10 angle agents in parallel → finalizer combines bes
|
|
|
2639
2797
|
- Background: {1-2 lines}
|
|
2640
2798
|
|
|
2641
2799
|
## Voice + Outbound Rules (condensed — full files available via Read tool)
|
|
2642
|
-
- Use
|
|
2643
|
-
- Flow skeleton: opener → pain → **what the product IS** → **what it DOES** (one action per line, up to three) → deployment ease → CTA → optional PS
|
|
2800
|
+
- Use `~/.sellable/configs/core/context-modes.md` to choose the right context stance, then run an anti-AI audit against `~/.sellable/configs/core/anti-ai-writing-style.md` before returning copy.
|
|
2801
|
+
- Flow skeleton: opener → pain → **what the product IS** → **what it DOES** (one action per line, up to three; prefer short bullets for 3 repeated-subject product actions) → deployment ease → CTA → optional PS
|
|
2644
2802
|
- A cold reader must be able to state what the product does in one sentence after reading. Require a crisp `Product is an X that does Y` anchor before any action breakdown. Do not gesture at "that chain" / "the stack" / "that work"
|
|
2645
2803
|
- Blank line between every sentence in the body. The body renders as a sequence of one-line paragraphs separated by blank lines, not as multi-sentence paragraphs. Target 6-10 one-line paragraphs
|
|
2646
2804
|
- 5th-grade reading level by default. Cut glue language (handoff, order-to-cash, rip-and-replace). Keep brief-native product/tool names (Shopify, HubSpot)
|
|
2647
|
-
- No bullet
|
|
2805
|
+
- No feature/benefit marketing bullet lists, no "I noticed...", no compliment sandwiches, no em dashes unless the canonical example uses one. Exception: use a short bullet stack when 3 adjacent product actions repeat the same subject pattern and bullets improve mobile readability.
|
|
2648
2806
|
- No synthesized framing ("at your stage", "in a setup like yours", "running X means...", "X means you're likely...")
|
|
2649
2807
|
- 3 candidates then `Finalizer Pass` — pick best opener, proof sentence, bridge, CTA across them and assemble the winner
|
|
2650
2808
|
- PS is optional; only include if it materially strengthens the fit case. When included, use `I` / `our CEO` / `our team` / `we` voice, never bare first names. At most two proof beats, tied to why the sender understands the buyer's pain. No three-credential resume lists
|
|
@@ -2706,7 +2864,7 @@ research → condense → 10 angle agents in parallel → finalizer combines bes
|
|
|
2706
2864
|
8. Return: { success: true, message: "...", research: [...], anglesExplored: 10 }
|
|
2707
2865
|
```
|
|
2708
2866
|
|
|
2709
|
-
**IMPORTANT:** Load
|
|
2867
|
+
**IMPORTANT:** Load `~/.sellable/configs/core/about-me.md`, `~/.sellable/configs/core/my-company.md`, `~/.sellable/configs/core/context-modes.md`, `~/.sellable/configs/core/proof-ledger.md`, `~/.sellable/configs/core/wins-ledger.md`, `~/.sellable/configs/core/anti-ai-writing-style.md`, `~/.sellable/configs/writing/outbound.md`, and `~/.sellable/insights/cross-skill.md` once in the lead agent. Use the legacy style guide fallback when present. Pass condensed versions to workers so context stays focused.
|
|
2710
2868
|
|
|
2711
2869
|
## Batch Approval
|
|
2712
2870
|
|