@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.
Files changed (48) hide show
  1. package/README.md +7 -7
  2. package/agents/post-find-leads-message-scout.md +176 -134
  3. package/dist/engage-memory.js +0 -5
  4. package/dist/identity-memory.js +0 -4
  5. package/dist/tools/engage-memory.js +2 -2
  6. package/dist/tools/leads.js +7 -3
  7. package/dist/tools/prompts.js +18 -12
  8. package/package.json +1 -1
  9. package/skills/create-campaign/SKILL.md +11 -12
  10. package/skills/create-campaign/context/learnings.md +1 -1
  11. package/skills/create-campaign/references/brief-template.md +2 -2
  12. package/skills/create-campaign-brief/references/brief-template.md +2 -2
  13. package/skills/create-campaign-brief/references/draft-lifecycle.md +1 -1
  14. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +2 -2
  15. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +41 -28
  16. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +27 -36
  17. package/skills/create-campaign-v2/SKILL.md +16 -9
  18. package/skills/create-campaign-v2/core/auto-execute.README.md +11 -11
  19. package/skills/create-campaign-v2/core/auto-execute.yaml +4 -4
  20. package/skills/create-campaign-v2/core/flow.v2.json +1 -1
  21. package/skills/create-campaign-v2/references/ai-tells.md +54 -19
  22. package/skills/create-campaign-v2/references/approval-gate-framing.md +10 -10
  23. package/skills/create-campaign-v2/references/escalation-ladder.md +3 -3
  24. package/skills/create-campaign-v2/references/final-handoff-contract.md +3 -3
  25. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +295 -226
  26. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +48 -9
  27. package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +4 -4
  28. package/skills/create-campaign-v2/references/lead-validation-preview.md +1 -1
  29. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +10 -10
  30. package/skills/create-campaign-v2/references/sample-validation-loop.md +3 -3
  31. package/skills/create-campaign-v2/references/{thomas-revision-filters.md → sellable-cleanup-rules.md} +29 -19
  32. package/skills/create-campaign-v2/references/step-15-re-cascade.md +1 -1
  33. package/skills/create-campaign-v2/references/thomas-variant-selection.md +1 -1
  34. package/skills/create-campaign-v2/references/validation-criteria.md +24 -18
  35. package/skills/create-campaign-v2-tail/SKILL.md +7 -7
  36. package/skills/create-campaign-v2-validation/SKILL.md +23 -7
  37. package/skills/create-post/SKILL.md +27 -27
  38. package/skills/engage/SKILL.md +12 -12
  39. package/skills/engage/core/README.md +14 -14
  40. package/skills/find-leads/SKILL.md +1 -1
  41. package/skills/generate-messages/SKILL.md +305 -147
  42. package/skills/interview/SKILL.md +24 -24
  43. package/skills/interview/references/legacy-linkedin-interview.md +12 -12
  44. package/skills/interview/references/reference-curation.md +4 -4
  45. package/skills/interview/references/voice-capture-method.md +1 -1
  46. package/skills/load-voice/SKILL.md +21 -25
  47. package/skills/research/SKILL.md +1 -1
  48. 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 one of two modes:
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 Phase 84 validation artifacts before any live campaign exists
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 this mode when create-campaign-v2 starts background Message Drafting after
32
- `confirm_lead_list` copies source rows and the first
33
- review/process sample exists.
34
- This is not the row-cell generation path.
35
-
36
- Inputs must come from the parent thread or scoped MCP/product tools for the
37
- current workspace/campaign:
38
-
39
- - campaign id plus campaign revision or `updatedAt`
40
- - current campaign brief and a brief hash
41
- - selected source state and `selectedLeadListId`
42
- - `workflowTableId`
43
- - imported review-batch contacts, row ids, and review-batch row hash
44
- - filter choice at branch start, plus filter/rubric basis when present
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 review-batch row ids/hash do not match. Do not reconstruct state from
48
- stale local markdown artifacts or direct database reads.
49
-
50
- Before drafting, load the packaged reference assets in "Reference Asset Loading"
51
- below through `mcp__sellable__get_subskill_asset`. In customer/package runs,
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 Thomas revision
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`, `Phase 84`,
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 create-campaign-v2
106
- Prospect Setup step, message generation may start before
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
- ## Phase 84 Dry-Mode Validation
141
+ ## Offline Validation
143
142
 
144
143
  Dry mode validates message quality before campaign mint.
145
144
 
146
- Read the campaign-specific dry-mode inputs from the caller's dry-run workspace:
145
+ Read these campaign inputs:
147
146
 
148
- - `.sellable/configs/core/about-me.md`
149
- - `.sellable/configs/core/my-company.md`
150
- - `.sellable/configs/core/context-modes.md`
151
- - `.sellable/configs/core/proof-ledger.md`
152
- - `.sellable/configs/core/wins-ledger.md`
153
- - `.sellable/configs/core/anti-ai-writing-style.md`
154
- - `.sellable/configs/writing/outbound.md` and legacy `styleguide-core.md` as fallback/source material when present
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
- ## Reference Asset Loading
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
- These references are packaged in `@sellable/mcp` and must be loaded through the
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
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign", assetPath: "references/ai-native-tokens.md" })`
169
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign", assetPath: "references/token-fill-examples.md" })`
170
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-brief", assetPath: "references/phase75-active-runtime-message-pack.md" })`
171
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/validation-criteria.md" })`
172
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/thomas-revision-filters.md" })`
173
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-patterns.md" })`
174
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-examples.md" })`
175
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-validation-example.md" })`
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 satisfy the list above by searching or reading the local filesystem.
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 `phase75-active-runtime-message-pack.md` as the **real line-level
222
- gold pack** for active clients and proven live message shapes
223
- - retrieve against the full archived gold-standard library and pick the closest 2-4 examples for consideration
224
- - use the runtime pack first for concrete formatting cues that the
225
- abstract archive may flatten away: lowercase vs title case, exact
226
- `two options:` formatting, short line rhythm, and load-bearing
227
- `p.s.` lines
228
- - treat the archive as the **quality bar and motion reference**, not a paste source. Your job is to write a new message that could plausibly belong in the archive, not to recolor an existing one
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 runtime pack shows a proven same-company or same-motion line that is
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
- - `may be off, but if {{workflow_signal}} is anywhere near your lane, this might be useful`
359
- - `if {{workflow_signal}} is nowhere near your lane, ignore me`
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
- - `saw you raise your hand for {{signal_topic}}, so figured this was (hopefully) worth sending` only when the engagement signal is the actual source
363
- - `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
364
-
365
- For LinkedIn-post-sourced campaigns (commenters, reactors, lead magnet
366
- replies, or scraped conversations), it is acceptable to reference the
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 anywhere near your
376
- lane...`, `if this is nowhere near your outbound workflow, ignore me`, `hope
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 anywhere near your lane...`.
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
- - `may be off, but if outbound is anywhere near your lane, this might be useful.`
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
- - if 3 adjacent mechanics, objection removers, proof points, or CTA
668
- options are genuinely parallel and easier to understand as a short
669
- `-` bullet stack, use the bullet stack in the winner. Do not reserve
670
- this for cleanup. Use bullets when they make the buyer picture the offer
671
- faster on mobile. If the product has 3+ plain mechanics such as pricing
672
- control, take-rate/economics, malpractice, credentialing, billing, async
673
- chat/photo care, or setup speed, prefer a compact bullet stack over
674
- separate prose lines unless bullets would make the note feel like a
675
- landing page. For data / intelligence products, if the buyer receives 3+
676
- concrete output types (e.g. accounts, infrastructure, signals, alerts,
677
- records, reports), prefer a short bullet stack over a dense mechanism
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 CTA must name the
748
- useful return artifact, preview, teardown, or working session.
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/thomas-revision-filters.md` (Earned-
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 segment, product boundary, or
1067
- buyer outcome instead of flashing a badge. Shapes:
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 backer] and focused on
1070
- [specific buyer segment / problem].` Keep it short and test it against no-PS.
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 nowhere near your outbound workflow, ignore me.`
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
- Dry-mode create-campaign-v2 message generation approves the **first outbound
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 compare, see, or get. The
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 nowhere near your outbound workflow, ignore me.`
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}}, saw you raise your hand for [topic], so figured this was (hopefully) worth sending.`
1692
- - `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.`
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
- - **Use bullets when the action lines are maximally parallel**: each starts with the same subject (e.g. `It X` / `It Y` / `It Z`), each is a discrete product function, none carries narrative context. This is the default case.
1904
- - Example shape: `- [Verb] [concrete object from the buyer's workflow].`
1905
- - **Use one-line paragraphs only when at least one action carries a short narrative clause** that wouldn't fit cleanly in a bullet.
1906
- - "Conversational motion" is **not** a reason to prefer paragraphs. If the three actions all start with `It X`, they are parallel by definition and should render as bullets.
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 list, whichever reads cleaner (see below)
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
- - 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.
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 one of the self-aware raise-hand shapes when the source is the
1954
- actual reason for the note: `saw you raise your hand for [topic], so figured
1955
- this was (hopefully) worth sending` or `saw you raise your hand for [topic]
1956
- (creepy to reach out based on that, i know) - but this felt too on the nose to
1957
- ignore`. Do not use the longer `you might not remember the thread...` shape;
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 nowhere near your outbound workflow,
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] because they're seeing the same [buyer pain] everywhere we look."`
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] because they're seeing the same [buyer pain] at every [segment] we talk to."`
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 Thomas revision filters before returning
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 | Thomas Filters | Result |
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
- - Bullet-stack decision: used | rejected | not applicable — reason
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
- - Bullet-stack decision: preserved | added | rejected | not applicable — reason
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 Thomas revision filters
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 Phase 75 brief-calibration assets already present:
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 the example bank as the primary strategy source even when the brief does
2544
- not already contain winning examples. Do not default to generic REPLY-style
2545
- copy when the motion clearly matches a tighter archived pattern. Strong
2546
- references include:
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
- - Sellable.dev
2700
+ - sellable.dev
2701
+ - Hey Digital
2549
2702
  - Galley
2550
- - Gelee
2551
- - HeyDigital
2552
- - Revvix / Spektion
2553
- - Superposition
2554
- - Persona Digital
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 archived winner,
2557
- borrow the closest message shape from
2558
- `gold-standard-message-examples.md` before inventing a new structure.
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 `.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.
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 points, no "I noticed...", no compliment sandwiches, no em dashes unless the canonical example uses one
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 `.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.
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