@sellable/mcp 0.1.0

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 (200) hide show
  1. package/.claude-plugin/plugin.json +12 -0
  2. package/.mcp.json +9 -0
  3. package/README.md +355 -0
  4. package/dist/api.d.ts +21 -0
  5. package/dist/api.js +73 -0
  6. package/dist/auth.d.ts +60 -0
  7. package/dist/auth.js +246 -0
  8. package/dist/engage-memory.d.ts +63 -0
  9. package/dist/engage-memory.js +354 -0
  10. package/dist/index-dev.d.ts +2 -0
  11. package/dist/index-dev.js +17 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.js +8 -0
  14. package/dist/server.d.ts +1 -0
  15. package/dist/server.js +499 -0
  16. package/dist/skills.d.ts +11 -0
  17. package/dist/skills.js +97 -0
  18. package/dist/tools/auth.d.ts +30 -0
  19. package/dist/tools/auth.js +124 -0
  20. package/dist/tools/blueprint-commit.d.ts +174 -0
  21. package/dist/tools/blueprint-commit.js +286 -0
  22. package/dist/tools/bootstrap.d.ts +64 -0
  23. package/dist/tools/bootstrap.js +246 -0
  24. package/dist/tools/campaigns.d.ts +589 -0
  25. package/dist/tools/campaigns.js +892 -0
  26. package/dist/tools/cells.d.ts +58 -0
  27. package/dist/tools/cells.js +48 -0
  28. package/dist/tools/context.d.ts +88 -0
  29. package/dist/tools/context.js +271 -0
  30. package/dist/tools/csv-domains.d.ts +73 -0
  31. package/dist/tools/csv-domains.js +464 -0
  32. package/dist/tools/csv-linkedin.d.ts +102 -0
  33. package/dist/tools/csv-linkedin.js +712 -0
  34. package/dist/tools/direct-campaigns.d.ts +240 -0
  35. package/dist/tools/direct-campaigns.js +250 -0
  36. package/dist/tools/engage-bootstrap.d.ts +94 -0
  37. package/dist/tools/engage-bootstrap.js +205 -0
  38. package/dist/tools/engage-discovery.d.ts +78 -0
  39. package/dist/tools/engage-discovery.js +150 -0
  40. package/dist/tools/engage-memory.d.ts +181 -0
  41. package/dist/tools/engage-memory.js +143 -0
  42. package/dist/tools/engage-state.d.ts +72 -0
  43. package/dist/tools/engage-state.js +62 -0
  44. package/dist/tools/enrichment.d.ts +167 -0
  45. package/dist/tools/enrichment.js +174 -0
  46. package/dist/tools/flow-preflight.d.ts +68 -0
  47. package/dist/tools/flow-preflight.js +138 -0
  48. package/dist/tools/framework.d.ts +44 -0
  49. package/dist/tools/framework.js +153 -0
  50. package/dist/tools/interaction-mode.d.ts +27 -0
  51. package/dist/tools/interaction-mode.js +102 -0
  52. package/dist/tools/leads.d.ts +2417 -0
  53. package/dist/tools/leads.js +2307 -0
  54. package/dist/tools/linkedin.d.ts +210 -0
  55. package/dist/tools/linkedin.js +229 -0
  56. package/dist/tools/navigation.d.ts +91 -0
  57. package/dist/tools/navigation.js +381 -0
  58. package/dist/tools/one-off.d.ts +229 -0
  59. package/dist/tools/one-off.js +273 -0
  60. package/dist/tools/processing.d.ts +70 -0
  61. package/dist/tools/processing.js +56 -0
  62. package/dist/tools/prompts.d.ts +211 -0
  63. package/dist/tools/prompts.js +210 -0
  64. package/dist/tools/provider-preflight.d.ts +21 -0
  65. package/dist/tools/provider-preflight.js +59 -0
  66. package/dist/tools/readiness.d.ts +261 -0
  67. package/dist/tools/readiness.js +510 -0
  68. package/dist/tools/rows.d.ts +126 -0
  69. package/dist/tools/rows.js +105 -0
  70. package/dist/tools/rubrics.d.ts +497 -0
  71. package/dist/tools/rubrics.js +681 -0
  72. package/dist/tools/senders.d.ts +44 -0
  73. package/dist/tools/senders.js +69 -0
  74. package/dist/tools/sequencer.d.ts +127 -0
  75. package/dist/tools/sequencer.js +194 -0
  76. package/dist/tools/tables.d.ts +35 -0
  77. package/dist/tools/tables.js +36 -0
  78. package/dist/tools/verify-row.d.ts +36 -0
  79. package/dist/tools/verify-row.js +38 -0
  80. package/dist/tools/workspaces.d.ts +140 -0
  81. package/dist/tools/workspaces.js +139 -0
  82. package/dist/utils/workspace-root.d.ts +1 -0
  83. package/dist/utils/workspace-root.js +39 -0
  84. package/package.json +46 -0
  85. package/skills/building-gtm-tables/SKILL.md +216 -0
  86. package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
  87. package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
  88. package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
  89. package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
  90. package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
  91. package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
  92. package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
  93. package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
  94. package/skills/building-gtm-tables/references/verify-loop.md +74 -0
  95. package/skills/campaign-messages/SKILL.md +173 -0
  96. package/skills/campaign-messages/flow.v1.json +75 -0
  97. package/skills/craft-message/SKILL.md +401 -0
  98. package/skills/create-campaign/ARCHITECTURE.md +232 -0
  99. package/skills/create-campaign/DISCUSS.md +296 -0
  100. package/skills/create-campaign/FLOW_ASCII.md +240 -0
  101. package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
  102. package/skills/create-campaign/README.md +142 -0
  103. package/skills/create-campaign/SKILL.md +286 -0
  104. package/skills/create-campaign/context/README.md +67 -0
  105. package/skills/create-campaign/context/_TEMPLATE.md +12 -0
  106. package/skills/create-campaign/context/context.md +35 -0
  107. package/skills/create-campaign/context/learnings.md +16 -0
  108. package/skills/create-campaign/context/registry.json +19 -0
  109. package/skills/create-campaign/core/flow.v1.json +217 -0
  110. package/skills/create-campaign/core/policy.md +191 -0
  111. package/skills/create-campaign/core/providers/apollo.json +35 -0
  112. package/skills/create-campaign/core/providers/prospeo.json +34 -0
  113. package/skills/create-campaign/core/providers/registry.json +31 -0
  114. package/skills/create-campaign/core/providers/sales-nav.json +37 -0
  115. package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
  116. package/skills/create-campaign/references/brief-template.md +64 -0
  117. package/skills/create-campaign/references/campaign-quality.md +84 -0
  118. package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
  119. package/skills/create-campaign/references/offer-patterns.md +108 -0
  120. package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
  121. package/skills/create-campaign/references/question-examples.md +167 -0
  122. package/skills/create-campaign/references/token-fill-examples.md +81 -0
  123. package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
  124. package/skills/create-campaign-brief/DISCUSS.md +64 -0
  125. package/skills/create-campaign-brief/README.md +176 -0
  126. package/skills/create-campaign-brief/SKILL.md +537 -0
  127. package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
  128. package/skills/create-campaign-brief/references/brief-template.md +220 -0
  129. package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
  130. package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
  131. package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
  132. package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
  133. package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
  134. package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
  135. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
  136. package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
  137. package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
  138. package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
  139. package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
  140. package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
  141. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
  142. package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
  143. package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
  144. package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
  145. package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
  146. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
  147. package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
  148. package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
  149. package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
  150. package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
  151. package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
  152. package/skills/create-campaign-v2/SKILL.md +1619 -0
  153. package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
  154. package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
  155. package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
  156. package/skills/create-campaign-v2/core/policy.md +82 -0
  157. package/skills/create-campaign-v2/references/ai-tells.md +253 -0
  158. package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
  159. package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
  160. package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
  161. package/skills/create-campaign-v2/references/filter-leads.md +495 -0
  162. package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
  163. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
  164. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
  165. package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
  166. package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
  167. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
  168. package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
  169. package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
  170. package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
  171. package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
  172. package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
  173. package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
  174. package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
  175. package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
  176. package/skills/create-campaign-v2-validation/SKILL.md +296 -0
  177. package/skills/create-post/SKILL.md +1308 -0
  178. package/skills/create-rubric/SKILL.md +251 -0
  179. package/skills/engage/SKILL.md +549 -0
  180. package/skills/engage/core/README.md +23 -0
  181. package/skills/engage/core/proven-searches.json +11 -0
  182. package/skills/engage/core/style-guide.template.md +47 -0
  183. package/skills/engage/core/tracked-people.json +10 -0
  184. package/skills/enrich-prospects/SKILL.md +97 -0
  185. package/skills/find-leads/SKILL.md +467 -0
  186. package/skills/generate-messages/SKILL.md +2361 -0
  187. package/skills/interview/SKILL.md +132 -0
  188. package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
  189. package/skills/interview/core/ICP.template.md +54 -0
  190. package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
  191. package/skills/providers/apollo.md +520 -0
  192. package/skills/providers/prospeo.md +398 -0
  193. package/skills/providers/sales-nav.md +372 -0
  194. package/skills/providers/signal-discovery.md +495 -0
  195. package/skills/research/SKILL.md +258 -0
  196. package/skills/research/config.json +9 -0
  197. package/skills/research/override.md +13 -0
  198. package/skills/research-prospect/SKILL.md +99 -0
  199. package/skills/research-sender/SKILL.md +158 -0
  200. package/skills/workflow-sequences/SKILL.md +85 -0
@@ -0,0 +1,2361 @@
1
+ ---
2
+ name: generate-messages
3
+ description: Generate LinkedIn messages either for live campaign leads or dry-mode validation samples, using gold-standard campaign examples first and the REPLY framework only as fallback.
4
+ visibility: internal
5
+ ---
6
+
7
+ # Generate Messages
8
+
9
+ You craft messages in one of two modes:
10
+
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
13
+
14
+ ## Tools
15
+
16
+ - `mcp__sellable__get_campaign` (live campaign mode only)
17
+ - `mcp__sellable__update_campaign_brief` (live campaign mode only)
18
+ - `mcp__sellable__get_rows` (live campaign mode only)
19
+ - `mcp__sellable__update_cell` (live campaign mode only)
20
+ - `mcp__sellable__get_message_prompt`
21
+ - `WebSearch` (live campaign mode only)
22
+ - `mcp__sellable__fetch_linkedin_profile` (live campaign mode only)
23
+ - `mcp__sellable__fetch_linkedin_posts` (live campaign mode only)
24
+ - `Task` (live campaign batch mode only)
25
+
26
+ ## Execution Modes
27
+
28
+ ### Mode 1: Live Campaign Mode
29
+
30
+ Use this mode when the caller provides a real `campaignId` or asks to save
31
+ messages into campaign rows.
32
+
33
+ This is the existing campaign-backed path. It may:
34
+
35
+ - load campaign and row data
36
+ - research prospects when needed
37
+ - save drafts or approvals
38
+ - update the campaign brief
39
+
40
+ **Live mode inherits the same quality contract as dry mode** — retrieval
41
+ against the archived gold-standard library, proof inventory ranking, 3
42
+ candidates + `Finalizer Pass`, 5th-grade reading level by default,
43
+ blank-line-per-sentence body shape, PS-must-earn-its-place, and
44
+ product-clarity flow (opener → pain → what the product IS → what it DOES
45
+ one action per line → deployment ease → CTA → optional PS).
46
+
47
+ Only the **process constraints** differ between modes (live mode can mutate
48
+ rows and fetch research, dry mode cannot). The **voice and shape rules are
49
+ identical**.
50
+
51
+ Apply the full "Retrieval & motion", "Proof inventory & token fill rules",
52
+ "Drafting & finalizer", "Voice rules", and "Product clarity" sections below
53
+ to live mode drafts, with live-mode-specific allowances:
54
+
55
+ - research the prospect when useful (WebSearch, LinkedIn tools) — but the
56
+ message must still pass the product-clarity, blank-line, and PS rules
57
+ - personalization from research is allowed, but it does not replace the
58
+ "what the product IS" / "what it DOES" anchors
59
+ - save behavior and calibration loop follow the live-mode workflow below,
60
+ but the drafted message itself is subject to the same Thomas revision
61
+ filters as dry mode
62
+
63
+ ### Mode 2: Caller-Declared DRY MODE
64
+
65
+ Use this mode when the caller explicitly says `DRY MODE`, `Phase 84`,
66
+ `create-campaign-v2`, or provides:
67
+
68
+ - `brief.md`
69
+ - `lead-filter.md`
70
+ - `lead-sample.json`
71
+
72
+ Required dry-mode contract:
73
+
74
+ - do not require, infer, or backfill `campaignId`
75
+ - do not call `mcp__sellable__get_campaign`
76
+ - do not call `mcp__sellable__get_rows`
77
+ - do not call `mcp__sellable__update_cell`
78
+ - do not call `mcp__sellable__update_campaign_brief`
79
+ - do not mutate DB-backed campaign state
80
+ - do not fetch fresh web or LinkedIn research
81
+ - use only `brief.md`, `lead-filter.md`, and `lead-sample.json`
82
+ - generate 2-3 sample messages inline
83
+ - write findings to `message-validation.md`
84
+ - start `message-validation.md` with `Mode: DRY MODE (no DB mutation)`
85
+
86
+ If the dry-mode response is missing the no-mutation preamble, treat that as a
87
+ hard failure and revise the output before returning it.
88
+
89
+ ## Phase 84 Dry-Mode Validation
90
+
91
+ Dry mode validates message quality before campaign mint.
92
+
93
+ Read:
94
+
95
+ - `brief.md`
96
+ - `lead-filter.md`
97
+ - `lead-sample.json`
98
+ - `mcp/sellable/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md`
99
+ - `mcp/sellable/skills/create-campaign-v2/references/validation-criteria.md`
100
+ - `mcp/sellable/skills/create-campaign-v2/references/thomas-revision-filters.md`
101
+ - `mcp/sellable/skills/create-campaign-v2/references/gold-standard-message-patterns.md`
102
+ - `mcp/sellable/skills/create-campaign-v2/references/gold-standard-message-examples.md`
103
+ - `mcp/sellable/skills/create-campaign-v2/references/gold-standard-message-validation-example.md`
104
+
105
+ Dry-mode output must follow this flow: **element pool → gold-standard
106
+ strategy map → current-campaign translation → element scoring → agent
107
+ dialogue cross-review → angle drafts → kill/combine review → finalists →
108
+ winner gate**.
109
+
110
+ ### Retrieval & motion
111
+
112
+ - treat `phase75-active-runtime-message-pack.md` as the **real line-level
113
+ gold pack** for active clients and proven live message shapes
114
+ - retrieve against the full archived gold-standard library and pick the closest 2-4 examples for consideration
115
+ - use the runtime pack first for concrete formatting cues that the
116
+ abstract archive may flatten away: lowercase vs title case, exact
117
+ `two options:` formatting, short line rhythm, and load-bearing
118
+ `p.s.` lines
119
+ - 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
120
+ - before choosing any example, name the **strongest true reason this buyer
121
+ should reply**. This is the north star: the most compelling safe mechanism,
122
+ proof, asset, diagnostic, offer, or buyer outcome available from the brief and
123
+ sample.
124
+ - choose one `Primary Example` only as packaging guidance: how to make that
125
+ reason feel human, readable, and non-AI in an inbox. The example does not
126
+ decide the message shape; the strongest true reason decides the shape.
127
+ - choose at most one `Secondary Influence` for a narrow purpose (CTA packaging,
128
+ proof compression, opener rhythm)
129
+ - choose the `Primary Example` by **reply-reason fit**, not just
130
+ founder/operator tone: which example best packages the strongest true thing
131
+ you can say without making it feel templated, scrape-y, or over-shaped
132
+ - do not default to `Superposition` just because the sender is a founder/operator. Down-rank any example whose native shape would force heavier proof, `two options:`, or list density than this brief actually needs
133
+ - do not blend multiple campaign motions into one message
134
+ - do not fill a shape for its own sake. A/B CTA, PS, sender-origin line,
135
+ category analogy, proof stack, and row-signal bridge are all optional
136
+ packaging tools. Use them only when they make the strongest true reason more
137
+ compelling or easier to reply to.
138
+ - **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
139
+ - if the runtime pack shows a proven same-company or same-motion line that is
140
+ doing real work, do not silently flatten it away in the name of generic
141
+ cleanliness
142
+ - 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`)
143
+
144
+ ### Proof inventory & token fill rules (document before drafting)
145
+
146
+ - rank usable proof:
147
+ 1. exact differentiated mechanism
148
+ 2. named credibility proof or strongest safe social proof
149
+ 3. concrete outcome proof
150
+ 4. deployment simplicity or speed-to-value proof
151
+ 5. founder, backing, prior-company, capital-raised-for-motion, or category-first proof
152
+ - treat "founder/backing" broadly: meaningful prior employers, notable investors, capital raised for the motion, or first-to-do-X differentiation — all valid only when the brief supports them
153
+ - classify every proof option before drafting:
154
+ - `body-worthy`: makes the core message clearer or more believable in one
155
+ natural line
156
+ - `translated`: the raw proof is useful, but must be rewritten into human
157
+ buyer language before it appears in the message
158
+ - `CTA-asset`: the proof is best used as something to send, show, or walk
159
+ through
160
+ - `PS-worthy`: the proof works only as a short natural aside after the CTA
161
+ - `internal-only`: useful for strategy, but awkward, confusing, braggy, or
162
+ skepticism-creating in the cold message itself
163
+ - supported proof is not automatically message-worthy. If a real person would
164
+ not say the proof line in a cold InMail, translate it or keep it internal.
165
+ - vague credibility wrappers are blocked. Phrases like `spoken publicly about`,
166
+ `publicly talked about`, `trusted by`, `worked with`, `used by`, or bare logo
167
+ lists are weak proof unless the same sentence names the buyer-relevant thing
168
+ that changed. Do not launder weak proof through testimonial language. If the
169
+ available proof only says a logo exists, keep it internal or turn it into a
170
+ CTA asset; do not put it in the body.
171
+ - raw activity metrics, interaction counts, usage counts, time-window claims,
172
+ revenue math, and traction numbers must pass the "so what?" test. The issue
173
+ is not that they are raw numbers; the issue is whether the buyer immediately
174
+ understands why the number is impressive, relevant, and reply-worthy.
175
+ - body-worthy proof must answer a buyer objection, not just display traction.
176
+ If the proof's real job is "this is live, not theoretical," say that in
177
+ natural language or omit the proof.
178
+ - default the body to **one main proof beat**: the strongest safe thing that
179
+ makes the buyer care. If a second beat does not answer a different buyer
180
+ objection or make the CTA more credible, cut it.
181
+ - document each token: name, source field, allowed transformation, fallback rule
182
+
183
+ ### Per-row signal extraction (do this FIRST, before any drafting)
184
+
185
+ The current defect that substance filters catch (Earned-right, Read-as-1:1)
186
+ is that the generator historically drafted 3 global templates and stamped
187
+ them onto sample rows. The correct flow is: **iterate rows first, extract
188
+ row-specific signal, draft per-row, then sample 2-3 rows for the output
189
+ artifact.**
190
+
191
+ 1. Iterate `lead-sample.json` rows. For each row, look for row-specific
192
+ signals in this priority order:
193
+
194
+ - a recent post (URL + excerpt from `recent_posts[]` or `posts[]`) —
195
+ strongest, because you can quote-back a line
196
+ - a profile-summary phrase in the buyer's own voice (verbatim string
197
+ from `headline` / `summary` / `about`)
198
+ - a hiring trigger (open role title + posting date) or a recent
199
+ funding event / product launch on the row's company
200
+ - a visible tool or tech-stack keyword in the headline
201
+ - a mutual connection or company-event (webinar, conference, podcast)
202
+ - NONE — the row is category-only. Flag in Findings as "signal-absent
203
+ row" so real sends can enrich upstream.
204
+
205
+ 2. Pick the SAMPLE ROWS for the artifact (2-3 rows) such that each
206
+ chosen row has a signal category DIFFERENT from the others — the
207
+ sample should show the motion working across post-quote, profile-
208
+ snippet, and trigger-led angles, NOT three iterations of the same
209
+ template. If the sample carries only ONE signal category, draft the
210
+ rows against that same category and flag the diversity gap in
211
+ Findings.
212
+
213
+ 3. For each chosen sample row, the draft MUST include the extracted
214
+ signal specifically in the body — quoted or clearly paraphrased,
215
+ never buried into generic category language. **Default placement is
216
+ Block 3 / line 3, not the opener.** Only move the signal into line 1
217
+ or line 2 when the chosen archived motion truly depends on a
218
+ signal-led opener and can stay free of source-citation /
219
+ scrape-forward phrasing.
220
+
221
+ 4. Never turn a signal into mind-reading or source narration. A row
222
+ signal means the person engaged with, posted about, hired for, or
223
+ publicly touched a topic; it does NOT prove the topic is "clearly on
224
+ their mind," a priority, a current initiative, or an active buying
225
+ motion. Engagement signals can qualify the lead, but the message
226
+ should mention the topic only when it can be translated into a natural
227
+ buyer context without sounding scraped or stalkerish.
228
+
229
+ Blocked shapes:
230
+
231
+ - `{{recent_signal}} is clearly on your mind`
232
+ - `AI-GTM stack is clearly on your mind`
233
+ - `you are clearly focused on...`
234
+ - `your team is obviously paying attention to...`
235
+ - `you're already thinking about...`
236
+ - `this is obviously relevant because...`
237
+ - `saw you on {{recent_signal}}`
238
+ - `saw you around {{recent_signal}}`
239
+ - `saw you engaging with {{recent_signal}}`
240
+
241
+ Safer shapes:
242
+
243
+ - `not sure if this is relevant, but if {{signal_topic}} is part of what you're testing, this may be useful`
244
+ - `this may be too specific, but the {{signal_topic}} angle felt close enough to send`
245
+ - `if {{workflow_signal}} is relevant at {{company}}, this might be useful`
246
+ - `thought this was worth sending because {{signal_topic}} touches the same problem`
247
+
248
+ ### Angle drafting & finalizer
249
+
250
+ Do not lock the strategy after the first decent idea. First create a
251
+ campaign element pool, score the elements, then draft angle variants from
252
+ the best combinations.
253
+
254
+ Before drafting, generate **3-5 options** for each element:
255
+
256
+ - sender relevance options: who is sending, and why that matters to this
257
+ buyer. Resume intros are blocked; sender identity is allowed when it
258
+ explains buyer relevance.
259
+ - buyer problem options: annoying, expensive, risky, or desire-shaped
260
+ facts the buyer would already understand.
261
+ - offer framings: what the recipient can actually do because this
262
+ product exists. Product category alone is not an offer.
263
+ - mechanism framings: what burden, workflow, risk, or manual work the
264
+ product removes.
265
+ - visibility-gap framings for data / intelligence products: what the buyer
266
+ already sees today vs. what the product uniquely lets them see. This often
267
+ beats a generic problem-solved opener because it makes the missing input
268
+ obvious without claiming the whole problem is fixed.
269
+ - proof options: mechanism proof, customer/result proof, sender proof,
270
+ backing/status proof, asset proof, and no-proof version where clarity
271
+ is stronger without explicit proof.
272
+ For each proof option, separately classify **proof hardness**: hard-to-fake
273
+ legitimacy proof vs. easy-to-claim proof. Hard-to-fake legitimacy proof
274
+ can matter even when it is not the strongest buyer-outcome proof because
275
+ it answers "is this real?" for a cold recipient. Easy-to-claim proof
276
+ includes vague outcome promises, unsupported speed claims, and broad
277
+ "we can help you get X" claims. Hard-to-fake proof includes public backing
278
+ or batch status, verified founder/operator credentials, live/public product
279
+ artifacts, public customer logos/results, public company profiles, or
280
+ other claims a recipient could plausibly verify.
281
+ Founder-dogfood proof must clarify the sender is founder, user, or
282
+ both. If both, say why that matters to the buyer; vague lines like `I
283
+ run my own on [Product]`, `using it myself now`, or `I use it myself`
284
+ are BLOCKED unless the same line makes the founder/user relationship and
285
+ buyer relevance clear.
286
+ - CTA options: single soft ask, send-over asset, short walkthrough, A/B
287
+ choice, or reply-with-interest.
288
+ - PS options: commitment-lowering aside, concrete preview aside,
289
+ proof-as-wink aside, tight customer/result proof, light human/humorous
290
+ aside, or no PS.
291
+
292
+ Score every option on:
293
+
294
+ - buyer care
295
+ - clarity
296
+ - believability
297
+ - hard-to-fake legitimacy / scam-risk reduction
298
+ - reply likelihood
299
+ - gold-standard fit
300
+
301
+ Tie-breaker: among truthful options, clarity beats completeness. Do not pick
302
+ the most technically accurate or comprehensive line if a simpler line is still
303
+ true and easier to understand. Preserve accuracy by avoiding false claims, but
304
+ do not stuff every qualifier into the message just because the brief supports
305
+ it. Cold outbound needs the clearest useful version, not the full specification.
306
+
307
+ Then choose a **Best Strategy Combination** before drafting: sender
308
+ relevance + buyer problem + offer + mechanism + proof role + CTA job +
309
+ PS decision. Explain why it beats the next-best combination.
310
+
311
+ `Gold Standard Strategy Map` is required before drafting. For the Primary
312
+ Example and any Secondary Influence, explain:
313
+
314
+ - buyer situation it interrupts
315
+ - strongest reason the buyer replies
316
+ - sender relevance
317
+ - offer clarity move
318
+ - mechanism clarity move
319
+ - proof role
320
+ - CTA job
321
+ - surface traits NOT to copy blindly
322
+
323
+ `Current Campaign Translation` is required before drafting. Map those
324
+ same jobs to this campaign and reject awkward equivalents. Do not copy
325
+ format until you can explain the line job.
326
+
327
+ Draft **5-7 rough angle drafts**, not 5-7 rewrites of the same message.
328
+ The goal is to see enough real message shapes to find the strongest reply
329
+ reason before polishing. Use only angles that are supported by the element
330
+ pool:
331
+
332
+ - sender-origin angle
333
+ - pain-removal angle
334
+ - offer-first angle
335
+ - mechanism-first angle
336
+ - proof-translated angle
337
+ - objection-handling angle
338
+ - CTA-preview angle
339
+
340
+ Each draft must test a different strategic approach: different opener job,
341
+ offer framing, proof placement, CTA shape, or mechanism emphasis. Do not
342
+ produce 5-7 tone variants of the same message.
343
+
344
+ When any proof is classified as `PS-worthy` or `CTA-asset`, the rough
345
+ angle set must include at least two drafts that test different proof/PS
346
+ treatments in actual message copy:
347
+
348
+ - proof in body vs proof in PS
349
+ - buyer-outcome PS vs no PS
350
+ - backing/status proof vs mechanism proof
351
+ - proof-as-CTA asset vs proof omitted
352
+ - light human/humorous PS vs straight PS vs no PS, only when humor lowers
353
+ friction without making the message clever, unserious, or less clear
354
+
355
+ Do not decide PS or proof placement only in analysis. The Finalizer should
356
+ choose after seeing the proof inside real draft shapes.
357
+
358
+ Each angle draft must be AGAINST A SPECIFIC SAMPLE ROW (name the row in
359
+ the angle's "Why this angle exists" line). If the row has a specific
360
+ signal, the signal must be traceable to `lead-sample.json`. If no signal
361
+ exists, say the angle is category-level and recommend upstream signal
362
+ enrichment in Findings.
363
+
364
+ Run a `Kill / Combine Review` before finalists:
365
+
366
+ - mark each angle `keep`, `combine`, or `reject`
367
+ - reject if unclear, weird, founder-braggy, over-explained,
368
+ resume-intro-shaped, proof-pasted, CTA-vague, or not reply-worthy
369
+ - name the exact line or decision that caused rejection
370
+ - do not let a merely supported proof beat survive if it hurts naturalness
371
+ or reply likelihood
372
+
373
+ Run an `Agent Dialogue Cross-Review` before angle drafts are allowed to
374
+ survive:
375
+
376
+ - **Skeptical prospect:** roleplay the skeptical version of the recipient,
377
+ someone who has been prospected on LinkedIn by similar products hundreds of
378
+ times. Reject elements before drafting when they trigger "not me", "so
379
+ what?", legal/employment anxiety, vendor-pitch fatigue, or product-category
380
+ confusion. Explicitly list the biggest offer red flags and belief gaps:
381
+ what they would not believe yet, what feels risky, what feels unclear, and
382
+ what would make them ignore the message even if the offer is true. Include
383
+ a `Legitimacy / scam-risk` check: would this read like a real company with
384
+ a real product, or like a random person making an easy-to-fake promise?
385
+ Then include a `Who is this / why trust them?` check. These are different:
386
+ sender credibility can answer peer relevance, but it may not answer whether
387
+ the company, platform, workflow, or offer is legitimate. If that gap exists
388
+ and hard-to-fake proof is available (YC/backing/funding, verified credentials,
389
+ public company/profile proof, live product artifacts, named customers/results),
390
+ test it as body-worthy or PS-worthy legitimacy proof rather than discarding it
391
+ as mere badge-flashing.
392
+ - **Offer strategist:** state the actual reply-worthy offer in plain English,
393
+ the buyer-side reason to care, the product explanation, the mechanism, proof
394
+ placement, and CTA job.
395
+ - **Gold-standard editor:** choose the closest gold motion by line job, not
396
+ surface resemblance. Name what the final message must do to sit near the
397
+ archive quality bar.
398
+ - **Cross-review consensus:** reconcile disagreement into one approved element
399
+ set before drafting: opener job, product explanation, mechanism, proof
400
+ treatment, CTA shape, PS/no-PS decision, and banned elements.
401
+
402
+ If the approved element set still contains a weak proof, abstract CTA, product
403
+ jargon, anti-current-state framing, or unsupported buyer assumption, do not
404
+ draft. Return `revise-message` with the exact missing strategy piece.
405
+
406
+ Build **2 finalists** from the best parts:
407
+
408
+ - finalist 1: cleanest / lowest-friction version
409
+ - finalist 2: strongest proof or CTA alternative that still sounds human
410
+
411
+ Run a `Skeptical Prospect Review` on each finalist before the Finalizer
412
+ Pass. Roleplay the skeptical version of the recipient: someone who has
413
+ been prospected on LinkedIn by similar products hundreds of times and is
414
+ looking for a reason to dismiss the note in 3 seconds.
415
+
416
+ The skeptical prospect must flag:
417
+
418
+ - the biggest offer red flags from the recipient's seat
419
+ - why they would not believe the offer yet
420
+ - what would make the offer feel risky, unclear, or too good to be true
421
+ - "so what?" proof or claims
422
+ - founder-story lines that do not help the buyer
423
+ - "who is this / why trust them?" gaps, especially when the sender has domain
424
+ credibility but the offer also requires platform/company execution
425
+ - product-category confusion
426
+ - buyer-identity mismatch: any line that makes the recipient feel like the
427
+ offer is for some other generic `a [role]` instead of for them specifically
428
+ - anti-employer / anti-current-vendor framing that the brief does not
429
+ explicitly allow
430
+ - a CTA that feels like a call trap or an unclear artifact
431
+ - any line that makes them think "not me," "too salesy," "too assumptive,"
432
+ or "I have seen this pitch before"
433
+
434
+ If the skeptical prospect would not keep reading or would not plausibly
435
+ reply, the finalist is blocked or rewritten. Do not let the writer grade
436
+ its own copy without this adversarial pass.
437
+
438
+ Bounded reviewer contract:
439
+
440
+ - each reviewer gets one pass only
441
+ - each reviewer may name at most 3 blockers and 1 recommended fix
442
+ - no recursive debate after the cross-review consensus is written
443
+ - once an element is approved, downstream passes may simplify, cut, or
444
+ reject it, but may not reopen the whole strategy
445
+ - if a line trips the same gate twice, cut it, change the strategy for
446
+ that line, or use the safer approved fallback instead of making tiny
447
+ wording-only rewrites
448
+ - ambiguous proof defaults to omitted, not softened into a new claim
449
+ - preserve the rejected proof in Findings if useful, but do not keep
450
+ trying to rescue it inside the message
451
+
452
+ Run a `Finalizer Pass` across the finalists and angle parts:
453
+
454
+ - pick the best opener (most relevant, least assumptive)
455
+ - pick the best offer sentence (what the buyer can do)
456
+ - pick the best mechanism sentence(s) (what burden is removed)
457
+ - pick the best proof treatment (body, translated, CTA asset, PS, or
458
+ internal-only)
459
+ - pick the best CTA job and wording
460
+ - decide whether PS is useful or should be omitted
461
+ - assemble the winner from those parts inside the chosen motion's
462
+ skeleton
463
+ - if all finalists use the same first substantive line, treat that as a
464
+ failed opener test. Rewrite and compare materially different opener jobs
465
+ before selecting a winner, or route to `revise-message`.
466
+ - if stitching stacks ideas awkwardly, cut to the stronger one
467
+ - run a phrase-level naturalness audit before selecting the winner. Block
468
+ coined or compressed strategy phrases when they technically describe the
469
+ idea but do not sound like something the sender would type to this buyer.
470
+ Non-exhaustive examples: `peer-built way`, `doctor-led path`,
471
+ `clinician-native option`, `the whole point is`, `platform-side proof`.
472
+ The pattern matters more than the exact words: if a phrase feels like an
473
+ internal label, strategy note, or stitched-together abstraction, rewrite
474
+ it into the concrete buyer benefit or sender intent. Every word and
475
+ phrase must make sense on first read without the recipient pausing to
476
+ decode it. If a phrase takes even a second to interpret, replace it with
477
+ plainer language tied to the exact basis row, e.g. `we're trying to
478
+ help...` or `built for [buyer] to...`. Do not overuse generic solved-state
479
+ bridges like `there's a way to...`; they read informercial when they imply
480
+ the buyer's problem is now solved before the product or artifact has earned
481
+ that claim.
482
+ - do not let the first substantive line become a generic problem-solved
483
+ promise. Openers shaped like `there's a way to stop/fix/solve [problem]`
484
+ are BLOCKED when they sound like an ad, imply the problem is already
485
+ solved, or fail to connect to the specific sample row. Prefer a concrete
486
+ row-fit line, a useful artifact, or a buyer-owned current-state observation
487
+ that the recipient can understand without reading the brief.
488
+ - if 3 adjacent mechanics, objection removers, proof points, or CTA
489
+ options are genuinely parallel and easier to understand as a short
490
+ `-` bullet stack, use the bullet stack in the winner. Do not reserve
491
+ this for cleanup. Use bullets when they make the buyer picture the offer
492
+ faster on mobile. If the product has 3+ plain mechanics such as pricing
493
+ control, take-rate/economics, malpractice, credentialing, billing, async
494
+ chat/photo care, or setup speed, prefer a compact bullet stack over
495
+ separate prose lines unless bullets would make the note feel like a
496
+ landing page. For data / intelligence products, if the buyer receives 3+
497
+ concrete output types (e.g. accounts, infrastructure, signals, alerts,
498
+ records, reports), prefer a short bullet stack over a dense mechanism
499
+ paragraph.
500
+ - if one finalist already holds the best of every piece, the winner may
501
+ equal it — name which one and on which axis it won (relevance,
502
+ distinctiveness, proof, coherence, readability)
503
+
504
+ The winner entry must:
505
+
506
+ - name which finalist or angle each borrowed part came from, or mark
507
+ "finalizer swept by Finalist X"
508
+ - name the SPECIFIC SAMPLE ROW the winning draft targets
509
+ - quote or paraphrase the row-specific signal used, or state that the
510
+ row is category-only
511
+ - include raw sendable message copy only. Do not select a "canonical
512
+ template", a subsection named "Approved Message Template", or a body
513
+ containing bracketed instructions such as `[ROW BRIDGE ...]`,
514
+ `[insert ...]`, or `[generated ...]`. If the only scalable option needs a
515
+ deferred per-row instruction, route to `revise-message` and fix the
516
+ token plan instead.
517
+ - never use generic signal tokens like `{{recentSignal}}`,
518
+ `{{recent_signal}}`, or `{{recent_signal_quote}}`. If row personalization
519
+ is needed, use concrete enriched-row fields such as `{{post_context}}`,
520
+ `{{comment_summary}}`, `{{profile_summary}}`, `{{source_post_topic}}`,
521
+ `{{headline}}`, or `{{row_proof_note}}`, and make the line work without
522
+ source-citation phrases like `caught my eye`.
523
+ - never use `{{profile_signal}}` in selected copy, message-review templates,
524
+ or rendered examples. It is an internal analysis bucket, not a sendable row
525
+ token. Lines like `{{profile_signal}} is why I thought this might be
526
+ relevant for {{company}}` are BLOCKED because they expose enrichment logic
527
+ and read as AI-generated mail merge. If the underlying signal is strong,
528
+ convert it into a named row-derived context token such as
529
+ `{{workflow_context}}`, `{{source_post_topic}}`, or `{{row_proof_note}}`;
530
+ if it is weak, omit the personalization line.
531
+
532
+ Finalizer preference when multiple candidates are otherwise comparable:
533
+
534
+ - prefer a **substance-first Block 1 + row-signal Block 3** winner over a
535
+ quote-back opener that starts with retrieved recipient text. Substance
536
+ means buyer-relevant current state, useful artifact, operator reality,
537
+ or mechanism — never `X here`, `I'm X at Y`, or a bare founder intro.
538
+ - only let the row signal lead the opener when the archived motion truly
539
+ depends on it and the line can stay clear of source-citation / talk-at
540
+ patterns (`"your post"`, `"your bio says"`, `"saw you posted"`,
541
+ `"last month you wrote"`)
542
+ - if a quote-back opener forces those patterns, keep the substance-first
543
+ opener and move the signal into Block 3 instead
544
+ - when comparing two otherwise good winners, the one that sounds like a
545
+ sharp human sender using context usually beats the one that sounds like
546
+ a scrape-driven callback
547
+ - prefer a **single low-pressure CTA** over `two options:` unless the
548
+ Primary Example itself is A/B and Option B is a genuinely strong
549
+ self-serve asset, proof artifact, or meta-demo that the brief clearly
550
+ supports
551
+ - if an A/B CTA adds ceremony without increasing buyer confidence, cut
552
+ it back to one ask
553
+ - do not default to founder-to-founder, MD-to-MD, doctor-to-doctor,
554
+ peer-call, compare-notes, or similar identity-call framing. Those CTAs
555
+ are usually weaker than naming the useful thing the buyer gets. Use them
556
+ only when the user explicitly chose that route or the brief makes that
557
+ peer-call motion the approved offer. Even then, the CTA must name the
558
+ useful return artifact, preview, teardown, or working session.
559
+ - when the message is selling or introducing a product, make the product
560
+ plain before asking for time, but do not make the opener sound like a
561
+ homepage definition. The reader should be able to answer "what is this?"
562
+ before the CTA. Prefer a simple human line such as `[Product] lets
563
+ [buyer] do [specific job]` or `I built [Product] so [buyer] can
564
+ [specific outcome]` when founder involvement is part of the offer. A
565
+ line shaped like `[Product] is a [category] platform -- feature, feature,
566
+ feature` is blocked when it reads like product copy instead of a note.
567
+ For command-native tools, describe the buyer job (`launch a LinkedIn
568
+ campaign from Claude/Codex`) before category nouns like `platform` or
569
+ `MCP`.
570
+ Do not make the CTA carry product explanation the body skipped.
571
+ - the final winner must enforce **one sentence per paragraph literally**
572
+ except for a deliberate short bullet stack, `two options:` CTA, or
573
+ optional PS. If a selected candidate has multi-sentence paragraphs,
574
+ split or cut before returning
575
+
576
+ Run an `Optional Simplifier Pass` after the Finalizer Pass and before the
577
+ Gold-Standard Quality Gate. This is not a strategy pass and must not
578
+ reopen the winner selection. It starts from the finalizer winner and only
579
+ asks whether the same message can be simpler, clearer, more concrete, and
580
+ more believable without losing force. Mobile readability matters, but it is
581
+ secondary to first-read clarity.
582
+
583
+ This pass is optional and conservative:
584
+
585
+ - keep the finalizer's strategy, strongest reply reason, proof role, CTA
586
+ job, casing style, tokens, and all AI-tell gates
587
+ - if the simplified candidate is clearer and still truthful, it becomes the
588
+ candidate passed into Final Subtraction. Do not keep the heavier finalizer
589
+ winner merely because it preserves more proof or mechanism detail.
590
+ - first run a required `Holistic Plain Rewrite`: rewrite the whole selected
591
+ candidate from scratch into the simplest clear version that preserves the
592
+ same reply reason. Do not preserve line order, proof placement, PS, or
593
+ sentence structure unless it still helps. The holistic rewrite should feel
594
+ like the clean message a sharp sender would actually send, not a polished
595
+ version of the finalizer's draft.
596
+ - then run a `Simplifier Line Pass` on every mechanism, proof, CTA, and PS
597
+ line that remains in either the finalizer draft or holistic rewrite. For
598
+ each line, write:
599
+ - original line
600
+ - plain rewrite
601
+ - keep original | keep rewrite | cut
602
+ - reason
603
+ The selected winner should start from the Holistic Plain Rewrite when it is
604
+ clearer and still truthful. Use the line pass as a safety check, not as a
605
+ constraint to preserve the old structure. Keep original lines only if the
606
+ holistic rewrite or plain rewrite loses important truth, specificity, or
607
+ believability. If both original and rewrite are too abstract, rewrite again
608
+ before the line can survive.
609
+ - a short line is not automatically simple. If a short mechanism line is
610
+ abstract, jargon-heavy, or hard to picture, rewrite it into the plain
611
+ action + output the buyer can understand. Example: `AI agents engage
612
+ trust-based scammers directly` is less clear than `BeeSafe uses AI agents
613
+ to talk to live scammers and turn those chats into fraud signals`.
614
+ - remove adjacent repetition. A pain line may name the problem and the
615
+ next line may name the mechanism, but they cannot reuse the same noun
616
+ stack unless the second line adds plainly new information. Bad:
617
+ `Credentialing, multi-state licensure, and malpractice usually kill the
618
+ idea.` followed by `FutureClinic handles credentialing, multi-state,
619
+ malpractice...`. Fix by translating one line into the buyer outcome, a
620
+ bullet stack, or a simpler mechanism line such as `FutureClinic handles
621
+ the admin work behind that.`
622
+ - remove semicolons from final copy. Semicolons are allowed in analysis,
623
+ but the selected message body and subject must not contain `;`.
624
+ - block sender-intro fragments shaped like `Usama here`, `derm here`,
625
+ `board-cert derm here`, `[credential] here`, or `[role] at [company]
626
+ here`. If sender proof matters, write it as a normal human sentence tied
627
+ to the buyer reason, such as `I use it with my own patients now.` or cut
628
+ it.
629
+ - preserve a finalizer bullet stack when it is doing clarity or mobile
630
+ readability work; do not flatten useful mechanics back into prose
631
+ - use a short `-` bullet stack only when 3 adjacent items are genuinely
632
+ parallel mechanics, proof points, objection removers, or options
633
+ - combine adjacent short sentences only when they are doing one job
634
+ - split dense sentences when they carry more than one idea
635
+ - do not bullet the opener, main proof line, CTA, or PS
636
+ - reject the simplified candidate if it loses specificity, weakens the
637
+ objection-remover, makes proof more generic, makes the CTA less useful,
638
+ sounds like a landing page, creates new unsupported claims, or keeps /
639
+ introduces a buyer-identity mismatch
640
+ - if simplification does not clearly improve simplicity, clarity,
641
+ concreteness, or believability, keep the
642
+ finalizer winner
643
+
644
+ Run a `Final Subtraction Pass` after the Optional Simplifier Pass and before
645
+ the Gold-Standard Quality Gate. This is the last copy pass and it optimizes
646
+ for reply likelihood, not constraint coverage.
647
+
648
+ Goal: shortest truthful message most likely to earn a reply.
649
+
650
+ For every line in the selected winner, ask:
651
+
652
+ - Would removing this line make the prospect less likely to reply?
653
+ - Does this line make the reply reason clearer, more believable, or easier
654
+ to act on?
655
+ - Is this line carrying one of the core jobs: buyer gap / pain, product
656
+ mechanism, concrete output, or CTA?
657
+ - Does this line repeat the same nouns, proof, or mechanism already stated
658
+ in the previous 1-2 lines? If yes, merge, translate, or cut.
659
+
660
+ If the answer is no, cut the line. True is not enough. Supported proof,
661
+ category claims, extra mechanisms, founder/context lines, PS lines, and raw
662
+ numbers are optional; they only stay when they clearly increase reply
663
+ likelihood more than they increase cognitive load.
664
+
665
+ When the CTA itself offers a concrete artifact, sample, audit, or preview,
666
+ that artifact is usually proof of usefulness, but not always proof of
667
+ legitimacy. If the offer could read as scammy, too-good-to-be-true, or
668
+ "random internet person asking me to trust a new platform," keep one
669
+ hard-to-fake legitimacy proof when it materially makes the company or offer
670
+ feel real. Do not keep proof/PS just because it answers a theoretical trust
671
+ objection in the artifact. Ask whether the actual final message would get
672
+ more replies with the extra line. If not, cut it.
673
+
674
+ Default keep-set:
675
+
676
+ - buyer pain / gap
677
+ - product mechanism in plain language
678
+ - concrete output or asset
679
+ - CTA
680
+
681
+ Default cut-set unless clearly reply-positive:
682
+
683
+ - `first`, `only`, category-claim lines
684
+ - lists of examples that merely prove the model knows the space
685
+ - raw proof numbers
686
+ - investor/backing PS that is only badge-flashing
687
+ - extra product explanation after the core mechanism is already clear
688
+ - any second CTA or proof beat that competes with the sample / main ask
689
+
690
+ Do not treat the artifact's analysis needs as copy needs. The message does
691
+ not need to show every reason it passed the prompt. It only needs enough for
692
+ the recipient to understand why replying is worth it.
693
+
694
+ Message-validation artifact budget:
695
+
696
+ - the final `message-validation.md` is an audit artifact, not a transcript
697
+ of every thought
698
+ - never let analysis consume the budget needed for `## Selected Winner`
699
+ - keep `## Strongest Reply Reason` under 80 words
700
+ - keep each analysis section to 1-3 compact bullets unless the section is
701
+ actual message copy
702
+ - `## Angle Drafts` should include 5-7 compact rough drafts or draft
703
+ skeletons, not long reasoning transcripts
704
+ - `## Candidate Messages` may include the 2-3 full candidate bodies
705
+ - `## Finalists` should summarize source parts and not duplicate full
706
+ message bodies already shown in Candidate Messages
707
+ - avoid large tables; if a table is necessary, cap it at 6 rows
708
+ - if output feels long, compress earlier analysis before shortening or
709
+ omitting the selected winner, gates, or findings
710
+ - once the winner passes the gates, emit the JSON immediately; do not run
711
+ another diagnostic loop or restart angle evaluation
712
+
713
+ **Substance-filter gate before the Finalizer Pass:** each candidate is
714
+ checked against the 8 Substance Filters in
715
+ `../create-campaign-v2/references/thomas-revision-filters.md` (Earned-
716
+ right, Presumption, Vague-proof, Read-as-1:1, Founder-origin coherence,
717
+ Anti-AI-tell, Anti-talk-at, Anti-self-introduction). A candidate that
718
+ fails any filter is marked BLOCKED in `message-validation.md` (cite
719
+ the filter name and the offending line) and CANNOT be selected as the
720
+ winner. If all 3 candidates are BLOCKED, DO NOT finalize — route to
721
+ `revise-message` with the enumerated failure reasons per candidate.
722
+
723
+ ### Reply-reason packaging contract (HARD INVARIANT)
724
+
725
+ Every candidate message (A / B / C) MUST be built around the strongest
726
+ true reason the buyer should reply. Message shape is packaging, not the
727
+ strategy. This contract exists because weak outputs can pass structural
728
+ checks while still reading as AI-generated: they fill blocks, mention a
729
+ sender, include a CTA, and never give the buyer a reason to care.
730
+
731
+ ### Pre-Draft Buyer-Role Analysis (HARD INVARIANT)
732
+
733
+ Do this BEFORE writing angle drafts. This is an internal roleplay
734
+ panel, not a tool call or subagent dependency. The goal is to prevent the
735
+ generator from drafting first and rationalizing later.
736
+
737
+ The panel has three roles:
738
+
739
+ - **Buyer-role reader:** roleplay the basis-row buyer using only the
740
+ brief, lead review, lead sample, and filter. Ask "why would I care,
741
+ what would confuse me, and what would make me reply?"
742
+ - **Offer-clarity critic:** translate the campaign into the actual offer:
743
+ what the recipient can do, what the product does, what burden the
744
+ product removes, and what the next step gives them.
745
+ - **Gold-standard editor:** compare the proposed strategy to the Primary
746
+ Example and block anything that is less believable, less clear, or more
747
+ self-centered than the gold-standard motion.
748
+
749
+ Before drafting, answer these five questions explicitly:
750
+
751
+ 1. **Who is sending it?** Identify the sender voice and what the body must
752
+ make clear without a body-level self-introduction.
753
+ - If explicit sender data exists in the brief or input artifacts, use it
754
+ as context for voice, proof, and buyer relevance.
755
+ - If the explicit sender is the founder/operator, use `I` / `we` when
756
+ referencing sender proof. Never refer to the sender as `the founder`,
757
+ `the CEO`, or a third-party person in the selected winner.
758
+ - If no sender is specified, assume a company-side growth/operator is
759
+ sending on behalf of the company. Use `we`, `our team`, `our CEO`, or
760
+ `our founder` only when the proof is explicitly supported. Do not
761
+ invent a founder-sender voice.
762
+ 2. **What is the actual offer?** State the offer in one plain sentence.
763
+ A product category is not an offer. A feature list is not an offer.
764
+ 3. **Why should this buyer care?** Name the buyer-side outcome, pain, or
765
+ curiosity that makes a reply plausible.
766
+ 4. **What proof makes it believable?** Pick the one proof beat that
767
+ answers the buyer's biggest skepticism.
768
+ 5. **What is the lowest-friction true next step?** Use only a next step
769
+ supported by the inputs.
770
+
771
+ Then choose the exact element pool that angle drafts are allowed to use:
772
+
773
+ - 3-5 sender relevance options
774
+ - 3-5 buyer problem options
775
+ - 3-5 offer sentence options
776
+ - 3-5 mechanism sentence options
777
+ - 3-5 proof uses, each classified as `body-worthy`, `translated`,
778
+ `CTA-asset`, `PS-worthy`, or `internal-only`
779
+ - 3-5 CTA options, including a single ask and A/B only if both choices
780
+ are genuinely useful
781
+ - 0-3 PS options, including `no PS` as a normal winning option
782
+ - phrases/angles to avoid
783
+
784
+ Before drafting, convert the winning element set into a **Message Element
785
+ Plan**. This is not a named template. It is the concrete list of pieces
786
+ the final message is allowed to use:
787
+
788
+ - base reusable pieces: sender relevance, buyer problem, product / offer,
789
+ mechanism, proof treatment, CTA, and optional PS
790
+ - optional sample-derived personalization pieces from `lead-sample.json`
791
+ - exact slot for each optional personalization piece: opener, soft bridge,
792
+ proof, CTA, or omit
793
+ - casing / voice style for the whole message
794
+ - whether each proof belongs in the body, PS, CTA artifact, or nowhere
795
+
796
+ Base reusable pieces are not personalization. Row personalization should
797
+ come from the sample only when it makes the message more believable, more
798
+ relevant, or easier to picture. If the message only works because the
799
+ basis row has a special detail, it is not ready for campaign use.
800
+
801
+ If the panel cannot produce a clear sender voice, actual offer, buyer
802
+ care reason, believable proof, and true CTA, do not draft candidates.
803
+ Return `revise-message` with the missing strategy pieces.
804
+
805
+ ### CTA / PS decision rules (HARD INVARIANT)
806
+
807
+ CTA and PS are tools, not defaults.
808
+
809
+ CTA options must be scored before drafting. Use `two options:` only when
810
+ both choices are genuinely useful and supported:
811
+
812
+ - option A gives the buyer a useful conversation or walkthrough
813
+ - option B gives a concrete self-serve asset, proof artifact, overview,
814
+ video, report, or meta-demo
815
+
816
+ Do not add option B just to mimic a gold standard. If the second option
817
+ is weak, use one CTA.
818
+
819
+ For artifact/sample offers, the CTA should usually be one self-contained
820
+ yes/no question that names the concrete thing the buyer gets. Do not split
821
+ the ask into a setup sentence plus a vague question.
822
+
823
+ Good shapes:
824
+
825
+ - `Open to a small redacted sample you can compare against your queue?`
826
+ - `Can I send over a small redacted sample you can compare against your queue?`
827
+ - `Open to seeing one example against your own workflow?`
828
+
829
+ Weaker shapes:
830
+
831
+ - `Want me to send a small redacted sample?` unless the sender voice is
832
+ intentionally casual/operator-ish
833
+ - `Happy to send a small redacted sample... Worth a look?`
834
+ - `Happy to send it over. Open to a quick look?`
835
+ - `Worth a look?` when the object of "it" is not in the same line
836
+
837
+ The buyer should be able to reply `yes` without deciding what yes means.
838
+ The CTA should feel open-handed, not like the sender is asking for a favor
839
+ or permission to do work. Prefer `open to...` or `can I send...` for
840
+ artifact/sample offers.
841
+
842
+ For unfamiliar or new categories, do not use abstract artifact asks like
843
+ `setup link` unless the buyer can already picture what that means. Prefer
844
+ a short preview CTA that names the buyer-specific outcome in one phrase,
845
+ not a list of screens. Example shape: `worth seeing what this would look
846
+ like for your own [buyer-owned thing]?`
847
+ Prefer `open to seeing...` over `worth seeing...` when the CTA is a
848
+ low-pressure preview of what the buyer would get. It reads more
849
+ open-handed and less like the sender is asking the buyer to judge value
850
+ before seeing anything. Default preview shape: `open to seeing what this
851
+ would look like for your own [buyer-owned thing]?`
852
+
853
+ For new categories, the CTA object should be the buyer outcome or preview,
854
+ not the artifact. `send the setup link` is usually weaker than `worth
855
+ seeing what this would look like for your own [buyer-owned thing]?`
856
+
857
+ PS is optional and rare. Use a PS only for one of these jobs:
858
+
859
+ 1. **Commitment-lowering aside** when the CTA could feel like a big
860
+ commitment. Shape: `p.s. no pressure to [big commitment]. thought it
861
+ might be useful to see [small preview].`
862
+ 2. **Concrete preview aside** when the category is new and the buyer may
863
+ not know what they are agreeing to see. Shape: `p.s. happy to show the
864
+ [specific side of workflow] too.`
865
+ 3. **Proof-as-wink aside** when the PS naturally verifies the core claim
866
+ without sounding like a credential dump. Shape: `p.s. yes, [this
867
+ message / artifact] was made with [product].`
868
+ 4. **Customer/result proof aside** when one short peer result makes the
869
+ message more believable but would bloat the main body.
870
+ 5. **Legitimacy aside** when the buyer is enterprise, regulated, high
871
+ trust, or being asked to try a new category / platform where durability
872
+ and trust matter. Backing like YC is often `PS-worthy` here because it
873
+ lowers "is this real?" / "will this company be around?" risk without
874
+ bloating the body. Its job can be legitimacy, not direct persuasion:
875
+ it answers whether the company and offer are real enough to take a look.
876
+ It must still tie the backing to the buyer segment, product boundary, or
877
+ buyer outcome instead of flashing a badge. Shapes:
878
+ `p.s. we're YC-backed and built for [specific buyer segment] trying to
879
+ [buyer outcome].` or `p.s. we're backed by [credible backer] and focused on
880
+ [specific buyer segment / problem].` Keep it short and test it against no-PS.
881
+
882
+ If YC, notable backing, funding, or named investor proof is present AND
883
+ the buyer is in healthcare, financial services, security, enterprise, or
884
+ another high-trust category, you must test one PS version unless the
885
+ brief explicitly forbids backing proof. Do not omit it solely because the
886
+ main CTA is single and low-pressure. Omit only if seeing it in the PS
887
+ makes the note feel more badge-flashy, less human, or less reply-worthy.
888
+ Testing a PS is not permission to keep it. No-PS should beat a weak
889
+ backing PS. A bare batch/name tag like `P.S. YC F24.`, `p.s. YC W26`,
890
+ `p.s. we're YC-backed`, or `p.s. backed by [investor]` is an automatic
891
+ loser because it makes the reader do the work. If backing proof cannot
892
+ tie to the buyer outcome in one natural sentence, omit it.
893
+
894
+ ### Legitimacy proof gate (HARD INVARIANT)
895
+
896
+ Before selecting the winner, ask whether the prospect's likely objection is
897
+ not "do I want this?" but "is this real and safe enough to engage with?" This
898
+ is common for healthcare, finance, security, enterprise, compliance, clinical,
899
+ employment-sensitive, and new-category offers.
900
+
901
+ If yes, identify the hardest-to-fake proof available and decide whether it
902
+ belongs in the body, PS, CTA artifact, or internal notes:
903
+
904
+ - hard-to-fake proof: YC/backing/batch status, verified credentials or
905
+ licenses, public company/profile pages, live product artifacts, named public
906
+ customers/results, audited/compliance artifacts, or a concrete product flow
907
+ the buyer can inspect
908
+ - easy-to-claim proof: broad outcome promises, "we can get you X", vague AI
909
+ automation claims, unsupported speed claims, or internal traction without
910
+ context
911
+
912
+ Use hard-to-fake proof when it makes the offer feel legitimate. Do not force
913
+ it to answer the buyer-outcome "so what?" by itself. Its job may simply be:
914
+ this is a real company / real product / real regulated workflow. Still avoid
915
+ defensive wording like `legit`, `real operation`, `not a side project`, or
916
+ `not a scam`. Let the proof carry the trust quietly.
917
+
918
+ 6. **Light human/humorous aside** when it reduces awkwardness or friction
919
+ without becoming the reason to reply. Test only when the tone can stay
920
+ professional and the buyer would not read it as unserious. Never force
921
+ humor into healthcare, finance, security, legal, compliance, or other
922
+ high-trust contexts if it weakens trust. Humor must be optional and
923
+ easy to delete.
924
+
925
+ Do not use PS to explain why the pitch is credible, defend the message,
926
+ summarize the strategy, add a second offer, or patch a weak body. If the
927
+ PS sounds like internal reasoning, delete it.
928
+
929
+ ### Raw proof translation test (HARD INVARIANT)
930
+
931
+ Before placing any numeric or traction proof in the selected winner, ask:
932
+
933
+ 1. Does the buyer immediately know whether this number is good?
934
+ 2. Does the number answer their likely objection?
935
+ 3. Would the sender say this exact line to a peer in a cold note?
936
+ 4. Does the line make the buyer more likely to reply, or just make the
937
+ sender sound active?
938
+
939
+ If any answer is no, the proof is not body-worthy. Translate it to the
940
+ buyer-relevant meaning or keep it internal.
941
+
942
+ Do not decide proof placement abstractly. When a proof element might help,
943
+ draft versions that use it in different ways:
944
+
945
+ - raw proof in the body
946
+ - translated proof in the body
947
+ - proof as CTA asset / proof artifact
948
+ - proof as PS
949
+ - no explicit proof
950
+
951
+ Keep the proof only if seeing it inside the message makes the final copy
952
+ clearer, more believable, or more reply-worthy. If the raw proof wins, it
953
+ must still sound like something the sender would actually say and must make
954
+ the buyer care more than the translated/no-proof version.
955
+
956
+ Allowed translation shapes:
957
+
958
+ - `I'm already using it with my own [workflow/customers/patients].`
959
+ - `This is already live, not a concept.`
960
+ - `We've seen this work with [peer/customer] for [buyer-relevant result].`
961
+
962
+ Blocked raw proof shapes:
963
+
964
+ - `[number] interactions in my first [time window]`
965
+ - `[number] users/customers/leads in [time window]`
966
+ - `[dollar amount] revenue math`
967
+
968
+ Those shapes are allowed only when they beat the translated/no-proof variants
969
+ and the line explains why the number matters to this buyer in plain language
970
+ while still sounding human.
971
+
972
+ ### Line-level "so what?" gate (HARD INVARIANT)
973
+
974
+ Before `confirmed`, inspect every line in the Selected Winner from the
975
+ prospect's perspective.
976
+
977
+ For each line, write the prospect-side answer to: `so what? why should I
978
+ care about this line?`
979
+
980
+ Keep the line only if the answer is compelling and immediate. If the answer
981
+ is weak, meta, internal, or "because the brief says it is true," rewrite,
982
+ move, or cut the line.
983
+
984
+ This applies to:
985
+
986
+ - sender relevance
987
+ - buyer pain
988
+ - offer
989
+ - mechanism
990
+ - proof
991
+ - CTA
992
+ - PS
993
+
994
+ Truth is not enough. The line must do a job for the prospect.
995
+
996
+ Use the 4-block shape below as the default packaging only when it helps
997
+ the reply reason land. If a different shape is more natural, shorter, or
998
+ more compelling for this offer, use it and explain why in `Packaging
999
+ Rationale`. What cannot change: the winner must make the strongest true
1000
+ reason obvious, avoid AI tells, and end with a useful reply path.
1001
+
1002
+ ### Gold-standard quality gate (HARD INVARIANT)
1003
+
1004
+ `confirmed` means the selected winner is good enough to sit next to the
1005
+ primary runtime gold example without sounding like a weaker AI copy of it.
1006
+ Do not mark `confirmed` just because headings, candidates, token tables,
1007
+ and a Finalizer Pass exist.
1008
+
1009
+ Before `confirmed`, run the selected winner against these gates:
1010
+
1011
+ - **Believability:** a real sender could plausibly type every line in
1012
+ LinkedIn without sounding like a landing page, resume, or pitch deck.
1013
+ - **Sender relevance:** the message answers why this sender is relevant to
1014
+ this buyer and offer. Resume intros are blocked, but sender identity is
1015
+ allowed when it explains the buyer problem, product origin, or why the
1016
+ offer exists.
1017
+ - **Non-assumption:** the opener does not assert what the buyer wants,
1018
+ feels, needs, or is trying to do unless the exact fact is grounded in
1019
+ the lead sample. If desire is inferred, use tentative framing like
1020
+ `not sure if this is relevant, but...`, `thought this might be
1021
+ relevant if...`, or `if you've ever wanted...`.
1022
+ - **Buyer-first opener:** after the greeting, the first substantive line
1023
+ should usually enter the buyer's world: a real signal, current-state
1024
+ pain, buyer-owned priority, or useful artifact. Sender-origin can come
1025
+ first only when it directly names the buyer-relevant mechanism or proof.
1026
+ If the opener reads like autobiography before the buyer knows why they
1027
+ should care, it is BLOCKED.
1028
+ - **Visibility-gap opener for intelligence products:** when the product sells
1029
+ data, intelligence, signals, or enriched evidence, use permissioned
1030
+ relevance unless the lead row proves the claim. The opener should make the
1031
+ buyer feel selected, not diagnosed. Do not write `you already have...`,
1032
+ `your team already sees...`, `you probably...`, or `the gap is...` unless
1033
+ that exact fact is present in `lead-sample.json`. Default shapes:
1034
+ `not sure if this is relevant, but if [workflow] still depends on [limited
1035
+ input], [product] might help with [missing input]`; `thought this might be
1036
+ useful if [buyer] is looking for [missing signal]`; `not sure if useful,
1037
+ but [product] is built around [gap]`. This usually beats broad
1038
+ loss/problem language because it makes the artifact valuable without
1039
+ sounding like the whole problem is solved.
1040
+ - **Basis-row fit before category fallback:** a function-level opener must
1041
+ still make immediate sense for the named basis row. If the basis row gives
1042
+ a clear role, company type, geography, or accountability, prefer a plain
1043
+ row-fit bridge over a broad category opener. Category-level openers like
1044
+ `Most [category]...` are last-resort fallbacks only; they are BLOCKED when
1045
+ the resulting line is vague, overly broad, or would make the named buyer
1046
+ ask "why are you saying this to me?"
1047
+ - **No proof-first opener:** when there is no strong row-specific signal,
1048
+ the first substantive line should normally start from a buyer-owned
1049
+ condition, not a sender-owned subject. Opener proof/origin lines that
1050
+ start with `I`, `I'm`, `I've`, `my`, `we`, `our`, `pre-`, or `before`
1051
+ are BLOCKED unless the same line is only a conversational hedge like
1052
+ `we haven't met` and immediately moves into the buyer's world. Put
1053
+ operator proof after the buyer pain.
1054
+ - **No resume intro:** any line shaped like `I'm a [credential/title] and
1055
+ co-founder of [company]` is BLOCKED when it functions as a standalone
1056
+ introduction. Sender identity is allowed only when it connects directly
1057
+ to buyer relevance, the product origin, or the offer. The LinkedIn UI
1058
+ already shows who sent the message; the body must explain why that
1059
+ matters.
1060
+ - **No bare founder intro:** a standalone line shaped like `I'm [name],
1061
+ co-founder at [company]` is also BLOCKED unless the same line explains
1062
+ why the sender matters to this buyer. Prefer opening on the
1063
+ buyer-relevant offer, mechanism, or operator origin. The sender card
1064
+ already handles name/title.
1065
+ - **Attribution clarity:** every operator-history or resume-history line
1066
+ must make it obvious who the fact belongs to: sender, recipient, or
1067
+ recipient company. Subjectless lines like `spent years as...`,
1068
+ `before [company]...`, or `scaled [company]...` are BLOCKED when a cold
1069
+ reader could misread them as the sender's background or the recipient's
1070
+ background. Recipient history can appear only when the exact fact is
1071
+ present in `lead-sample.json`; otherwise keep it out. Sender history can
1072
+ appear only when it is explicitly tied to the buyer problem in the same
1073
+ sentence and still passes the buyer-first / no-resume gates.
1074
+ - **No third-person sender:** if sender data identifies the sender as the
1075
+ founder/operator, the selected winner must not refer to that same person
1076
+ as `the founder`, `the CEO`, or another third-person role. Use `I` or
1077
+ `we` and tie the proof to buyer relevance. If no sender is specified,
1078
+ do not invent first-person founder proof; use company-side operator voice
1079
+ (`we`, `our team`, `our CEO/founder`) only when the proof is supported.
1080
+ - **No weak identity-call CTA:** founder-to-founder, MD-to-MD,
1081
+ doctor-to-doctor, peer-call, compare-notes, and similar identity-call
1082
+ CTAs are BLOCKED unless the user explicitly selected that motion or the
1083
+ brief names it as the approved offer. A buyer should not have to care
1084
+ about the sender's identity to understand the value of saying yes.
1085
+ Prefer CTAs that name a concrete useful return, such as a setup preview,
1086
+ workflow teardown, sample artifact, or walkthrough of their own likely
1087
+ use case.
1088
+ - **No founder-name hook:** do not use the sender/founder first name as the
1089
+ reason to open, read, or reply. Subject lines like `Austin's review`,
1090
+ `{{founder_name}}'s teardown`, or `founder call` are blocked because the buyer
1091
+ does not yet care who the founder is. The CTA can mention a named founder only
1092
+ if the name adds trust or the user explicitly requested named-founder branding.
1093
+ Default to the useful return artifact: `map one reporting problem`, `review
1094
+ one dashboard`, `pressure-test one workflow`, or equivalent.
1095
+ - **Element discipline:** the winner must follow the Message Element Plan.
1096
+ Base pieces stay reusable across the segment. Optional row-personalization
1097
+ pieces must be sourced from `lead-sample.json`, placed deliberately, and
1098
+ removable without breaking the message.
1099
+ - **Personalization for believability:** row tokens are not just decoration.
1100
+ If a generic line would become more believable, more relevant, or easier to
1101
+ picture by using a safe row token, the draft must test that version. This is
1102
+ especially true when the base copy says `without quitting`, `your current
1103
+ company`, `companies like yours`, `teams like yours`, `your workflow`,
1104
+ `hiring [role]`, `your [function] team`, `your market`, or similar generic
1105
+ context and `lead-sample.json` has a current company, role, account type,
1106
+ market, hiring signal, team/function, or workflow signal. Good token usage is
1107
+ neutral and grounding: `without leaving {{company}}`, `for your
1108
+ {{role_specialization}} team`, `if you're hiring {{hiring_role}}`, `for
1109
+ {{account_segment}}`, or a CTA like `open to seeing what this would look
1110
+ like alongside {{company}}?`. Block row tokens when they sound scrape-y,
1111
+ create legal / employment anxiety, blame the employer, imply employer
1112
+ approval, or do not change the reply reason. Generic substitutes like `your
1113
+ group`, `your company`, `your team`, `a role like that`, or `companies like
1114
+ yours` are not enough when a safe row token would make the line feel more
1115
+ grounded. First test the tokenized version. If the raw field is too long,
1116
+ noisy, or awkward, create a natural row-derived context token such as
1117
+ `{{employer_context}}`, `{{hiring_role}}`, `{{role_specialization}}`,
1118
+ `{{workflow_context}}`, or `{{account_segment}}` with a clear fill rule
1119
+ (`{{company}}` when clean, otherwise `your group`; exact hired role when
1120
+ clean, otherwise `the role you're hiring for`). If the final winner contains
1121
+ row-dependent context and uses neither the exact token nor a row-derived
1122
+ context token, it must explain why the token would be unsafe or less
1123
+ believable. "Generic reads cleaner" is not enough. If a safe token would
1124
+ improve fit-believability and the winner omits it, the gate is BLOCKED.
1125
+ If the final copy contains generic row-context phrases such as `your
1126
+ employer`, `your current group`, `your team`, `your company`, `the role`,
1127
+ `the open role`, `your workflow`, `that process`, or `companies like yours`
1128
+ and the row has the matching context, the generic phrase itself must usually
1129
+ become a token (`{{employer_context}}`, `{{team_context}}`,
1130
+ `{{hiring_role}}`, `{{workflow_context}}`, `{{account_segment}}`) with a
1131
+ clear fill rule. Do not write generic row-context phrases in the final copy
1132
+ and then say personalization was omitted. The exception is when even the
1133
+ derived token creates safety risk or makes the sentence less believable; if
1134
+ so, cut the row-context phrase rather than leaving it generic.
1135
+ - **Token restraint:** personalization that makes the sentence clunkier is worse
1136
+ than no personalization. Tokenized lines such as `Reaching out because
1137
+ {{reporting_context}} sits in the kind of reporting ownership...`, `your
1138
+ {{role_context}} work`, or `noticed your {{topic}}` are BLOCKED when the filled
1139
+ version sounds like mail merge. A good token should either make the sentence
1140
+ more concrete in normal language or be omitted. If the row signal is weak,
1141
+ write the segment-level line and document the omit rule.
1142
+ - **No internal profile-signal token:** `{{profile_signal}}` is never allowed
1143
+ in customer-facing copy, message-review templates, rendered examples, token
1144
+ notes, or approval-packet message bodies. It names how enrichment classified
1145
+ the row, not what a buyer would recognize. Use a concrete field or a
1146
+ row-derived token with a clear fill rule (`{{workflow_context}}`,
1147
+ `{{source_post_topic}}`, `{{row_proof_note}}`) and only keep it when the
1148
+ rendered sentence sounds natural.
1149
+ - **Product clarity:** the product noun must be plain enough that a cold
1150
+ reader can say what happens. `chat clinic` by itself is not enough
1151
+ when the buyer would reasonably ask "what does that mean?" Prefer
1152
+ concrete mechanics like patients subscribing to the doctor, async
1153
+ photo/chat follow-ups, credentialing, billing, or malpractice coverage
1154
+ when those are the actual differentiators.
1155
+ - **Selling clarity:** if the message is selling or introducing something,
1156
+ the body must clearly say what it is before the ask. The CTA can be
1157
+ simple and call-based only after the offer is clear. Good shape:
1158
+ `this is what it is` -> `why it might matter to you` -> `if that would
1159
+ be remotely helpful, open to a quick call / preview?`
1160
+ - **Clarity over completeness:** accurate does not mean exhaustive. If a
1161
+ technically fuller sentence is harder to parse than a simpler true sentence,
1162
+ choose the simpler sentence. Do not include every supported caveat, category
1163
+ term, or mechanism detail in message 1 unless it directly increases reply
1164
+ likelihood.
1165
+ - **Buyer-identity fit:** when the recipient already has the credential,
1166
+ role, or identity required by the offer, do not describe the product as
1167
+ serving `a [role]` in a way that makes the buyer feel outside the group.
1168
+ Generic lines like `lets a board-certified derm...` are BLOCKED when the
1169
+ basis row is already a board-certified dermatologist. Use `you`,
1170
+ `[role]s like you`, or a direct product-category line instead. The
1171
+ recipient should feel "this is for me specifically," not "this is for a
1172
+ category I happen to be in." Prefer respectful full role terms by default
1173
+ (`dermatologist` over `derm`, `physician` over `doc`) unless the brief or
1174
+ gold motion proves the abbreviation is buyer-native.
1175
+ - **No product tautology:** a product definition line cannot merely say
1176
+ `[Product] is a [category] on [Product]` or `It's a [category] on
1177
+ [Product]`. The line must explain what the buyer can do, who uses it,
1178
+ what changes, or how the mechanism works.
1179
+ - **Proof naturalness:** supported proof is not enough. The selected proof
1180
+ must make the message clearer, more believable, or more reply-worthy in
1181
+ plain human language. If the raw proof sounds weird, vanity-like,
1182
+ founder-braggy, or confusing, it must be translated or kept internal.
1183
+ Ambiguous metric lines are blocked when the buyer cannot tell why the
1184
+ number matters without extra explanation.
1185
+ - **Proof strength:** `spoken publicly about`, `publicly talked about`,
1186
+ `trusted by`, `worked with`, `used by`, and bare customer-logo lists are
1187
+ BLOCKED as body proof when they do not say what changed for the buyer. A
1188
+ usable proof line should compress a concrete result, mechanism, or risk
1189
+ reducer. If the honest version is only "these logos exist", omit it from the
1190
+ message and keep it in Findings.
1191
+ - **Proof tie-breaker:** choose one main body proof. If two proofs answer
1192
+ different objections, pick the one that removes the biggest reply blocker
1193
+ for this buyer. Put the second proof in PS only if it lowers vendor or
1194
+ category risk in one natural aside; otherwise keep it internal and note it
1195
+ in Findings. Do not loop over whether to use both.
1196
+ - **Customer proof placement:** when customer/logo proof is useful mainly for
1197
+ legitimacy, put it in a short PS instead of interrupting the body. The body
1198
+ should carry buyer pain, mechanism, and CTA. The PS can carry one concrete
1199
+ proof sentence if it names what customers used the product/service for, e.g.
1200
+ `p.s. Schindler used CaseWhen for team training, ZBI/Union Investment for
1201
+ internal Power BI resources, and Peek & Cloppenburg for unified customer
1202
+ reporting.` Do not write a PS that is only a logo list. Do not label the PS
1203
+ with internal phrases like `relevant proof:`, `useful proof:`, `proof:`, or
1204
+ `social proof:`.
1205
+ - **Weak early-traction proof:** small-N or early-window proof like
1206
+ `140 interactions in my first 2 weeks`, `first two weeks`, or similar is
1207
+ BLOCKED unless it directly lowers a specific buyer objection. Treat the
1208
+ raw number as internal-only by default. Do not soften it into a nearby
1209
+ invented claim like `over 100 patient interactions` or re-litigate it in
1210
+ later passes. If the number mostly proves the sender is using the
1211
+ product, use the softer founder-dogfood proof (`I use it myself with
1212
+ real patients`) or omit proof entirely.
1213
+ - **Read-aloud exactness:** every phrase in the selected winner must
1214
+ sound like something the sender would actually say out loud. Awkward
1215
+ shorthand such as `board-cert derms`, internal/product shorthand, or
1216
+ phrases that only make sense after reading the brief are BLOCKED.
1217
+ Compressed strategy phrases are also BLOCKED when they feel like internal
1218
+ labels instead of buyer-language. Do not overfit to an exact banned list:
1219
+ judge whether the phrase would sound natural from this sender to this
1220
+ recipient, then rewrite into plain sender intent or buyer benefit.
1221
+ - **Zero-parse-friction:** every word and phrase should clearly make sense
1222
+ on first read. If the recipient has to pause for even a second to decode
1223
+ what a phrase means, who it refers to, why it matters, or how it connects
1224
+ to the offer, the phrase is BLOCKED. Replace clever, compressed, or
1225
+ abstract bridge/PS wording with the plain thing it means. Judge this from
1226
+ the basis row's seat, not from the brief. If a term is only clear after
1227
+ reading the campaign thesis (`rails`, `queue`, `trust-based`, `motion`,
1228
+ `lane`, etc.), either anchor it to a concrete buyer context or use simpler
1229
+ language.
1230
+ - **Operator proof naturalness:** operator-background proof must answer
1231
+ "why should this buyer trust this sender on this exact pain?" without
1232
+ sounding like resume chronology. Standalone lines shaped like
1233
+ `pre-[company], I scaled...`, `before [company], I...`, or
1234
+ `I built/scaled [company] into...` are BLOCKED unless the same sentence
1235
+ ties directly to the buyer's current workflow pain. Prefer conversational
1236
+ proof like `we ran into this constantly at [operator company]` or
1237
+ `saw this at [operator company] too`.
1238
+ - **No vague fragment lines:** short fragments are allowed only when they
1239
+ add human rhythm and concrete meaning. Generic fragments such as
1240
+ `same back-office pain every week`, `same problem every time`, or
1241
+ `exactly why we built this` are BLOCKED unless the surrounding line names
1242
+ the specific buyer-owned problem.
1243
+ - **Jargon / acronym exactness:** use buyer-native acronyms only when the
1244
+ brief or sample supports them, and place them in concrete sentences.
1245
+ Avoid abstract glued phrases like `APP-fraud exposure`, `attacker-
1246
+ infrastructure signal`, or `rails can match` unless that exact buyer
1247
+ language is visible. Translate to plain mechanics when possible:
1248
+ `matched mule accounts from APP scams` beats `APP-fraud exposure`.
1249
+ - **Mechanism focus:** when the product can do several workflows, the
1250
+ first-touch winner should usually pick the most painful workflow and
1251
+ make that one easy to picture. A single line that stacks three major
1252
+ surfaces, such as orders + forecasting + inventory, is BLOCKED unless
1253
+ the brief's actual offer requires the full bundle in the first ask.
1254
+ - **Style consistency:** choose one casing style before drafting and obey
1255
+ it. Do not mix a formal bare-name greeting or sentence-case intro with
1256
+ a lowercase body. If using casual lowercase common words, use a casual
1257
+ greeting like `hey Kevin,` and keep the whole message in that style
1258
+ while preserving proper nouns, acronyms, and `I`. If using `Hi Kevin,`
1259
+ or writing to an enterprise/regulated buyer, use standard sentence case
1260
+ throughout.
1261
+ - **No code fences around copy:** `## Selected Winner` must contain the
1262
+ raw message only. Do not wrap the final copy in ``` fences or markdown
1263
+ blocks; those are artifact formatting, not message copy.
1264
+ - **No mind-reading from signals:** if a line uses a post, topic
1265
+ engagement, public activity, role, company, hiring trigger, or any
1266
+ other row signal, it must describe the observable fact softly. It
1267
+ cannot assert the buyer's internal priority, intent, focus, budget, or
1268
+ urgency unless `lead-sample.json` states that exact fact. Phrases such
1269
+ as `clearly on your mind`, `obviously focused on`, `already thinking
1270
+ about`, or `clearly relevant` are BLOCKED. Source-y phrases such as
1271
+ `saw you on...`, `saw you around...`, and `saw you engaging with...`
1272
+ are also blocked unless the archived winner explicitly depends on that
1273
+ self-aware signal style. Translate the signal into low-certainty buyer
1274
+ context instead: `not sure if this is relevant, but if [topic] is part
1275
+ of what you're testing...`, `this may be too specific, but [topic] felt
1276
+ close enough to send`, or a similarly natural line.
1277
+ - **No internal-metric flex:** internal process details are not proof by
1278
+ default. Compute time, token/cache details, model names, number of
1279
+ agents, orchestration internals, or `~5 min of compute per message`
1280
+ are BLOCKED unless the brief proves the buyer already cares about that
1281
+ exact operational detail. Translate to buyer value or cut. `runs inside
1282
+ Claude Code` can matter for Claude-native operators; `5 min of compute`
1283
+ is usually a "who cares?" line.
1284
+ - **CTA truth:** the CTA cannot invent an artifact or action the brief
1285
+ did not explicitly support. `spin up your clinic page`, `send a
1286
+ teardown`, `record a video`, or similar assets are BLOCKED unless the
1287
+ input says that exact next step exists. When unsure, ask for the
1288
+ lowest-friction true next step from the brief, such as sending the
1289
+ setup link, next step, or a short walkthrough.
1290
+ - **CTA clarity:** if the product category is unfamiliar, the CTA must
1291
+ make the preview easy to imagine in one short phrase. Avoid vague asks
1292
+ like `send the setup link` unless the message has already made that
1293
+ artifact concrete. For new categories, do not make the artifact noun the
1294
+ object of the CTA; make the buyer outcome the object and use the artifact
1295
+ only as the delivery mechanism if needed.
1296
+ - **Self-contained yes/no CTA:** for artifact, sample, preview, or audit
1297
+ offers, the selected winner should end with one clear question whose
1298
+ object is in the same line. Avoid `Happy to send...` plus `Worth a look?`
1299
+ because it splits the ask and makes the buyer infer what yes means.
1300
+ Prefer `Want me to send [specific artifact]?` or `Open to [specific
1301
+ artifact / preview] you can [use/check/compare]?`.
1302
+ - **CTA specificity:** generic CTAs like `compare notes`, `worth a chat`,
1303
+ `open to a call`, or `quick walkthrough` are BLOCKED unless the same
1304
+ line names the specific thing the buyer will compare, see, or get. The
1305
+ next step must be easy to picture.
1306
+ - **Preview CTA wording:** when the CTA is a preview, prefer `open to
1307
+ seeing...` over `worth seeing...` unless the chosen gold motion strongly
1308
+ supports `worth`. `Open to seeing what this would look like for your own
1309
+ [buyer-owned thing]?` is the default preview shape.
1310
+ - **Workflow-test CTA:** for ops / workflow products, prefer a CTA that
1311
+ lets the buyer imagine testing the product on their own workflow or a
1312
+ safe sample artifact. `worth seeing how this would handle one retailer
1313
+ PO from your inbox?` beats `worth 15 min to compare notes?` because the
1314
+ buyer can picture what happens next.
1315
+ - **PS restraint:** if a PS appears, it must do one clear job:
1316
+ commitment-lowering aside, concrete preview aside, proof-as-wink, or
1317
+ tight customer/result proof. If it explains the strategy, defends the
1318
+ pitch, or patches weak credibility, it is BLOCKED.
1319
+ - **YC / backing PS:** a PS that only says `we're YC`, `we're YC W26`,
1320
+ `backed by YC`, or similar is BLOCKED as badge-flashing. If YC/backing
1321
+ is used, the same sentence must either tie to the buyer segment/outcome
1322
+ (`we're YC-backed and trying to help banks stop scam money before it
1323
+ moves`) or materially lower commitment (`happy to send the sample
1324
+ without a call first`). Prefer the buyer-outcome version when both fit.
1325
+ For high-trust or new-category offers, YC/backing should be tested as a
1326
+ PS before being marked internal-only; the question is whether the PS
1327
+ lowers trust risk for the buyer, not whether the body already has one
1328
+ proof beat. Do not require YC/backing to be the strongest reason to care;
1329
+ it can be kept when its main job is hard-to-fake legitimacy.
1330
+ Defensive PS language is BLOCKED. Do not write `real operation`, `not a
1331
+ side project`, `serious company`, `legit`, or any line that argues with an
1332
+ imagined objection out loud. The PS should sound like useful context, not a
1333
+ rebuttal. Preferred shape: `p.s. we're YC-backed and trying to help
1334
+ [buyer segment] [buyer outcome].`
1335
+ Batch-code PS lines such as `P.S. YC F24.` are BLOCKED. They are
1336
+ badge-flashing and create no prospect-side "so what?" answer. If the
1337
+ sentence cannot answer why YC/backing makes the next step safer or more
1338
+ relevant for this buyer, choose no PS.
1339
+ - **Line-level so-what:** every selected line must have a compelling
1340
+ prospect-side answer to "so what?" If a line is true but the prospect
1341
+ would not immediately understand why it matters, it is BLOCKED until
1342
+ rewritten, moved, or cut.
1343
+ - **Skeptical prospect:** the selected winner must survive a skeptical
1344
+ prospect who has been prospected on LinkedIn by similar products hundreds
1345
+ of times. If that reader would dismiss the note as founder story, vague
1346
+ product pitch, anti-employer framing, generic proof, or unclear CTA, route
1347
+ to `revise-message`.
1348
+ - **Brief framing obedience:** if the brief says to avoid anti-employer,
1349
+ anti-competitor, anti-PE, or rebellious framing, any line that blames or
1350
+ negatively characterizes the buyer's employer/current setup is BLOCKED.
1351
+ Negative contrast lines are also blocked unless explicitly allowed:
1352
+ `not a gig platform`, `not a faceless service`, `not built like X`,
1353
+ `unlike [competitor/current setup]`, or `instead of [negative category]`.
1354
+ State the positive buyer outcome directly.
1355
+ - **Gold-standard match:** the winner should preserve the quality of the
1356
+ Primary Example: human opener, strongest supported proof, clear
1357
+ mechanism, and a useful CTA. If the winner is materially weaker than
1358
+ the Primary Example, route to `revise-message`.
1359
+ - **Template disguise:** if the selected winner contains bracketed
1360
+ instructions, a placeholder paragraph, a "canonical template" label, or
1361
+ any instruction for a later generation step to invent a row-specific
1362
+ bridge, it is not a winner. Route to `revise-message`.
1363
+ - **Signal-token disguise:** if the selected winner contains a generic
1364
+ `recentSignal` / `recent_signal` token, or a phrase like `caught my eye`
1365
+ that hides a source citation, route to `revise-message`. The row bridge
1366
+ must use concrete enriched-row fields or be omitted.
1367
+
1368
+ If any gate fails, set status to `revise-message`, cite the offending
1369
+ line, and include the best corrected direction. Do not finalize a merely
1370
+ less-bad version.
1371
+
1372
+ **Default Block 1 — Hey + buyer-relevant substance.** ~1-2 sentences.
1373
+ Establishes WHY THIS MIGHT MATTER (the buyer's current state, useful
1374
+ artifact, operator reality, or mechanism), NOT WHO THE SENDER IS. The
1375
+ LinkedIn UI already shows the recipient who sent the message (sender
1376
+ name, photo, headline), so the body should NEVER
1377
+ include `"X here"`, `"I'm Y"`, `"{{sender_name}}, {{title}} at
1378
+ {{company}}"`, or any self-identification phrase — those are
1379
+ Filter-8 violations. NEVER references the recipient yet either (no
1380
+ `{{first_name}} — saw you...`, no `Your X is...`). Open with what
1381
+ matters to the buyer or the operator-reality that led to it. Acceptable
1382
+ openers:
1383
+
1384
+ - `Hey {{first_name}}, [one plain sentence about what we built].`
1385
+ - `Hey {{first_name}}, pre-[product], we [did the operator-reality
1386
+ thing] for [X] years; [one-line consequence].`
1387
+ - `Hey {{first_name}}, building a thing for [segment] I think you'd
1388
+ have an opinion on. My co-founder and I [did operator-reality
1389
+ thing] before this...`
1390
+
1391
+ Unacceptable Block-1 openers (Filter-8 violations):
1392
+
1393
+ - `Hey {{first_name}} — {{sender_first_name}} here.` (the `"X here"`
1394
+ clause is a self-intro tell — the LinkedIn UI already shows who
1395
+ sent the message)
1396
+ - `Hey {{first_name}}, I'm {{sender_name}}, co-founder at [company].`
1397
+ - `{{sender_name}}, [title] at [company]. We do [X].`
1398
+
1399
+ **Default Block 2 — Mechanism.** ~1 sentence. What the product actually does
1400
+ in plain words. NOT a feature list. NOT a stack dump. NOT a
1401
+ parenthetical of tool names. Name ONE concrete action the product
1402
+ takes on the buyer's behalf, or the single most important class of
1403
+ work it handles.
1404
+
1405
+ Block 2 must name the **product category / system class explicitly**,
1406
+ not just the actions. The reader should be able to answer "what is
1407
+ this thing?" after the sentence, not just "what does it do?".
1408
+
1409
+ Required shape:
1410
+
1411
+ - `[Product] is [category noun] that [does the key action]`
1412
+ - `it's an [AI receptionist / AI SRE / agent / platform / layer] that [does Y]`
1413
+
1414
+ If no clean existing category fits, you may **coin a short category by
1415
+ analogy** — but only when it makes the buyer's mental model clearer on
1416
+ first read.
1417
+
1418
+ Good coined-category shapes:
1419
+
1420
+ - `it's like Claude Code for AppSec`
1421
+ - `it's an AI SRE for on-call teams`
1422
+ - `it's a control layer for outbound calling`
1423
+
1424
+ Rules for coined categories:
1425
+
1426
+ - anchor them to a category or product the buyer already understands
1427
+ - keep them short enough to say in one breath
1428
+ - prefer clarity over cleverness
1429
+ - if the coined label sounds hype-y, abstract, or investor-pitchy, cut
1430
+ it and fall back to the plain category noun
1431
+ - do not coin a category if the plain one is already clear enough
1432
+ - do not stack two analogies in the same sentence
1433
+
1434
+ Not acceptable:
1435
+
1436
+ - `we pick up the calls your front desk misses...`
1437
+ - `it books into your PMS and verifies insurance...`
1438
+ - `we investigate incidents before you wake up...`
1439
+
1440
+ Those lines can follow the category sentence, but they cannot replace it.
1441
+
1442
+ For technical / operator motions, Block 2 must stay especially tight:
1443
+
1444
+ - do not laundry-list 3-4 vendor names in the body just because the
1445
+ brief allows them
1446
+ - name the category noun or system class first (`"it's an AI SRE"`,
1447
+ `"it's an AI receptionist"`, `"it's a lightweight layer"`) before
1448
+ listing any action
1449
+ - when a coined category is genuinely clearer than the plain noun,
1450
+ coin it once and then move straight to the action. Example:
1451
+ `"it's like Claude Code for AppSec — it ..."` not a full analogy
1452
+ paragraph
1453
+ - name the system class or workflow first (`"works inside the on-call
1454
+ thread"`, `"investigates incidents before a human wakes up"`,
1455
+ `"books straight into your PMS"`)
1456
+ - mention at most **one** buyer-native tool name inline unless the row
1457
+ signal itself makes a specific tool the reason the note is relevant
1458
+ - if the mechanism needs more than one clause to make sense, the product
1459
+ explanation belongs in the later "what the product DOES" breakdown,
1460
+ not in a glued Block-2 sentence
1461
+
1462
+ **Default Block 3 — Soft bridge to recipient.** ~1 sentence. Light callback
1463
+ to a row signal, paraphrased and casual. NEVER a verbatim block
1464
+ quote with quotation marks. NEVER `"your profile says"` or `"the
1465
+ post you wrote on [date]"`. Frame as natural memory:
1466
+
1467
+ - `"Thought of {{company}} because..."`
1468
+ - `"Feels relevant to the [area] work you've been doing."`
1469
+ - `"Saw you're working on [area]."`
1470
+ - `"You've been writing about [paraphrased topic], which is almost
1471
+ exactly what we built around."`
1472
+
1473
+ If the row has no usable signal, Block 3 becomes a peer observation
1474
+ (`"feels relevant to the shape of what you're doing at
1475
+ {{company}}"`), not a broadcast `"most [segment] teams see..."`
1476
+ opener.
1477
+
1478
+ **Default Block 4 — Low-pressure CTA.** ~1 sentence. Casual founder cadence:
1479
+
1480
+ - `"Worth 20?"`
1481
+ - `"20 min sometime?"`
1482
+ - `"Could grab time this week or next?"`
1483
+ - `"Open to a quick chat?"`
1484
+
1485
+ NOT `"Worth a 20-min walkthrough?"`, NOT `"Let's set up a meeting."`,
1486
+ NOT `"reply if you want a quick walkthrough"` unless the line names what
1487
+ the buyer will see or get, NOT `"We're picking 2 Q1 2026 pilot partners — would you like to
1488
+ be one?"` (over-precise numerics trip Filter 6).
1489
+
1490
+ Default to a **single** CTA line. Use `two options:` only when both are
1491
+ true:
1492
+
1493
+ 1. the chosen archived motion is genuinely A/B
1494
+ 2. Option B is a concrete self-serve asset, proof artifact, or
1495
+ meta-demo that is clearly stronger than an ordinary reply ask
1496
+
1497
+ If either condition fails, keep one low-pressure CTA.
1498
+
1499
+ `Single CTA` means **one next step only**. Do not smuggle a second option
1500
+ into the same line with `or i can send...`, `or happy to share...`, or
1501
+ similar fallback phrasing unless the motion is explicitly A/B.
1502
+
1503
+ Do not use pilot-slot scarcity, quarter labels, or exact slot counts in
1504
+ the CTA by default (`"2 Q1 pilot partners"`, `"3 beta slots left"`).
1505
+ Only keep scarcity when the archived motion truly depends on it and the
1506
+ brief makes that scarcity central to the offer.
1507
+
1508
+ **Body proof density.** The body gets one main proof beat by default.
1509
+ If the message already has a strong sender-reality opener and clear
1510
+ mechanism line, do not also stack integration count, deployment detail,
1511
+ open-core detail, and audit-trail detail in the same note. Keep the
1512
+ single strongest proof treatment in the body; move the rest to an optional PS
1513
+ only if it materially increases fit-believability, or keep it internal when it
1514
+ would make the message less natural.
1515
+
1516
+ **NO signoff line.** See next section.
1517
+
1518
+ ### NO SIGNOFF LINE (HARD INVARIANT — multi-sender hardening)
1519
+
1520
+ Generated messages MUST NOT include a signoff line. Reject any
1521
+ candidate body that ends with:
1522
+
1523
+ - `— {{sender_name}}`
1524
+ - `— Jimmy (co-founder, IncidentFox)`
1525
+ - `Best, [name]`
1526
+ - `Cheers, [name]`
1527
+ - `Thanks, [name]`
1528
+ - any line of the shape `[em-dash or punctuation] [first name] [role
1529
+ in parens]`
1530
+
1531
+ Reasons this is a HARD INVARIANT:
1532
+
1533
+ 1. **Multi-sender pipelines.** The same message template may be
1534
+ dispatched from multiple LinkedIn sender accounts. A hardcoded
1535
+ founder name breaks personalization across senders — the message
1536
+ literally has the wrong name when sent from a different account.
1537
+ 2. **LinkedIn already shows sender identity.** The recipient sees
1538
+ who sent the InMail from the LinkedIn UI itself (profile photo,
1539
+ name, headline at the top of the thread). A signoff line is
1540
+ redundant at best, incorrect at worst.
1541
+ 3. **Gold-standard archive behavior.** The Revvix, Galley, Superpower,
1542
+ and Superposition winners archived in
1543
+ `gold-standard-message-examples.md` do NOT include hardcoded
1544
+ signoffs — they end on the CTA. Match the archive.
1545
+
1546
+ **Token exception:** if a `{{sender_name}}` variable is templated into
1547
+ the body (e.g., as part of a PS referencing the sender's role), it
1548
+ must appear inline with context, not as a trailing line. Example:
1549
+ `"Our CEO [did X]"` is fine. `"— [Name]"` as the last line is
1550
+ rejected.
1551
+
1552
+ **Validator token-adherence check:** the `message-validation.md`
1553
+ Token Adherence Table must include a column or row-level assertion
1554
+ `"No signoff line: YES"`. If a candidate ships a signoff, mark it as
1555
+ a BLOCKED candidate (Filter 7 / Anti-talk-at also applies since the
1556
+ signoff is a talk-at shape).
1557
+
1558
+ ### Voice rules
1559
+
1560
+ **Reading level (default = plain English)**
1561
+
1562
+ - write at a 5th-grade reading level by default, even when the brief is technical
1563
+ - prefer short common words over industry jargon. "Orders come in by email" beats "sales order intake workflow." "It works on top of what you already use" beats "deploys as an overlay on the existing stack"
1564
+ - when the brief uses a piece of jargon (e.g. "Shopify"), keep the product/tool name exactly; the jargon to cut is the glue language around it
1565
+ - Casing must look intentional. Lowercase casual style is allowed for common words when the chosen motion uses it, but proper nouns, recipient names, company names, product names, acronyms, and the pronoun `I` stay capitalized. Do not output broken casing like `i'm`, `futureclinic`, or `michael`. Do not lowercase token values or invent transform syntax like `{{company_lower}}`, `{{first_name | lower}}`, or bracketed casing instructions; use the row value as a proper noun, or omit the optional token line if the value does not fit.
1566
+ - the only time a higher reading level is allowed is when the archived winner for this motion is the **same company** as the brief and the winner deliberately uses denser language (e.g. Superposition drafting for Superposition). In every other case, plainer language wins
1567
+
1568
+ **Sentence and line shape**
1569
+
1570
+ - **each sentence is its own paragraph** — put a blank line between every sentence in the body, even short ones
1571
+ - literally: the body should render as a sequence of one-line paragraphs separated by blank lines, not as multi-sentence paragraphs
1572
+ - this matches the archived winners (Revvix, Galley, Superposition all paragraph-break per sentence). It gives the reader one idea at a time and lets short sentences breathe
1573
+ - mobile scanability is a hard requirement. The winner should read cleanly in a one-thumb scroll on a phone
1574
+ - keep most sentences in the **6-14 word** range. If a sentence is above ~18 words or has more than one comma, split it
1575
+ - the whole body target is about 6-10 one-line paragraphs, **not** 3 multi-sentence paragraphs
1576
+ - if a line would wrap into a heavy 3-line block on mobile, cut or split it
1577
+ - keep the CTA as its own short line. In most cases the CTA should be **4-10 words**
1578
+ - **the PS is a single paragraph.** Its one or two sentences stay on the same line (or at most a soft line break between them — never a blank line). Every other sentence in the body gets its own paragraph; the PS does not
1579
+
1580
+ **Product clarity (non-negotiable)**
1581
+
1582
+ A cold reader of the message must be able to state, in one sentence, **what the product does** — in plain English, without re-reading the pain section to infer it.
1583
+
1584
+ This rule is violated when the mechanism gestures at "that chain," "the stack," or "that work" without naming the specific actions the product takes. If the reader has to infer what the product does from context, the copy fails.
1585
+
1586
+ Flow skeleton (apply even when motion varies):
1587
+
1588
+ 1. Opener anchored in the buyer's workflow
1589
+ 2. Pain — what's breaking now
1590
+ 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".
1591
+ 4. **What the product DOES** — one action per line. Three actions maximum. Choose the rendering by a **concrete test**, not a feeling:
1592
+ - **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.
1593
+ - Example shape: `- [Verb] [concrete object from the buyer's workflow].`
1594
+ - **Use one-line paragraphs only when at least one action carries a short narrative clause** that wouldn't fit cleanly in a bullet.
1595
+ - "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.
1596
+ - Never stack the three actions into one glued comma-list sentence.
1597
+ 5. Deployment ease — one short paragraph
1598
+ 6. CTA — useful next step, binary when the brief supports it
1599
+ 7. Optional PS — only if it materially strengthens the fit case
1600
+
1601
+ Rules within the flow:
1602
+
1603
+ - **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.
1604
+ - **preferred**: one action per line — as one-line paragraphs or as a bullet list, whichever reads cleaner (see below)
1605
+ - the "what the product IS" sentence comes **before** the action breakdown — skipping it makes the actions feel disconnected
1606
+ - if the brief does not support three distinct actions, drop to two or one. Do not pad.
1607
+ - if a proof sentence gets long, split the metric and the explanation into separate one-line paragraphs rather than chaining them together
1608
+
1609
+ **Per-lead signal must appear when available**
1610
+
1611
+ Category-level openers of the shape `"Most [category] teams still do X by hand"` read as mail merge at the lead level, even when `{{category}}` is tokenized per lead. They are only acceptable when `lead-sample.json` carries zero per-lead signal for this lead.
1612
+
1613
+ Rules:
1614
+
1615
+ - if `lead-sample.json` carries **any** per-lead signal for this lead — a recent post, a recent hire, a visible tool in the headline, a topic engagement, a public initiative — the **message must reference it specifically**. Category-level copy is rejected.
1616
+ - default placement is **Block 3**, not Block 1. Keep Block 1 substance-first unless the archived motion clearly earns a signal-led opener without falling into source-citation / talk-at phrasing.
1617
+ - acceptable signal use by default:
1618
+ - `"Not sure if this is relevant, but if [topic] is part of what you're testing, this may be useful."`
1619
+ - `"Thought of {{company}} because [observable signal] touches a similar problem."`
1620
+ - `"This may be too specific, but the [topic] angle felt close enough to send."`
1621
+ - blocked signal use:
1622
+ - `"AI-GTM stack is clearly on your mind."`
1623
+ - `"You're clearly focused on [area]."`
1624
+ - `"This is obviously relevant because you engaged with [topic]."`
1625
+ - `"You are already thinking about [area]."`
1626
+ - `"Saw you on [topic]."`
1627
+ - `"Saw you around [topic]."`
1628
+ - `"Saw you engaging with [topic]."`
1629
+ - 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. Follow Superpower's `"saw you were active around some [topic] stuff recently and figured this might actually be relevant"` shape only when it reads like a real human note rather than a retrieval flex.
1630
+ - if no per-lead signal exists, a category-level opener is acceptable as a fallback, but the Findings section must flag: `"Category-level opener used because lead-sample.json carries no per-lead signal. Real sends should surface signals in lead-sample.json before using this template."`
1631
+ - this pushes the real fix upstream to find-leads, where the sample payload should include signals when they exist
1632
+
1633
+ **Tone and framing**
1634
+
1635
+ - avoid em dashes unless the chosen archived exemplar already uses them. In the final winner, prefer a period and a new line
1636
+ - avoid synthesized framing like "at your stage", "in a setup like yours", "running X means...", and "X means you're likely..."
1637
+ - in proof-led fallback, anchor to buyer-language workflow terms from the brief instead of generic "most teams..." openers (details in `gold-standard-message-patterns.md`)
1638
+ - samples in one set should read like siblings from one campaign, not three experiments
1639
+ - **subject lines follow the same jargon rules as the body.** Banned glue language (the same classes listed above for body copy) stays out of the subject too. Use the plain buyer-language equivalents the body uses. Shape rule: prefer the original gold-standard A + B + C pattern only when the filled subject piques buyer interest: a concrete row/company token + a concrete buyer workflow/problem + a useful artifact/result. A + B + C is not a license to stuff tokens. Only use a tokenized subject component when that token is supported by row data, natural when rendered, and more interesting than a non-tokenized version. Subjects must not use sender/founder names, `Austin's review`, `founder call`, `demo`, or `quick call` as the hook. Good: `{{company}} + Power BI sprawl + cleaner ownership`, `reporting handoffs + Power BI + team ownership`, `{{source_post_topic}} + active leads + first message test`, or `reachability + BlackHat + booth 1517`. Bad: `first LinkedIn campaign`, `quick question`, `Austin's one-report review`, `{{company}} + {{reporting_context}} + Austin's review`, `outbound`, or abstract `[brand] [jargon term]`.
1640
+ - prefer short common words and concrete verbs. `real revenue` beats `P&L`. `made` or `brought in` beats `generated incremental revenue`. `answers calls` beats `handles inbound communication workflows`
1641
+
1642
+ **PS shape (optional — only include when it helps the reader decide this is a fit)**
1643
+
1644
+ The PS is optional and rare. Include it **only if it materially
1645
+ strengthens the fit case** for this buyer. If the proof available would
1646
+ just add noise, drop the PS entirely.
1647
+
1648
+ Exception: when the proven runtime message shape includes a **load-bearing
1649
+ PS**, treat it as part of the canonical skeleton, not optional garnish.
1650
+ This especially applies to:
1651
+
1652
+ - a meta-demo / verification line that proves the core product claim
1653
+ - a short operational aside that closes the loop on the CTA
1654
+ - a same-company proven message where removing the PS weakens the motion
1655
+
1656
+ Example: for `sellable.dev`, `p.s. yes, this message was entirely written
1657
+ and sent via claude code 😊` is not filler proof. It verifies the product
1658
+ claim and makes option B more believable. Do not prune that kind of PS just
1659
+ because the body already has mechanism + relevance.
1660
+
1661
+ When it is included:
1662
+
1663
+ The PS's job is to make the CTA feel safer, more concrete, or more
1664
+ believable. It should read like a natural final aside, not like a
1665
+ credibility repair patch.
1666
+
1667
+ A PS can do four jobs:
1668
+
1669
+ 1. commitment-lowering aside: lowers fear that a reply means buying,
1670
+ launching, migrating, switching, or committing
1671
+ 2. concrete preview aside: makes a new category easier to picture by
1672
+ naming one side of the workflow the buyer can see
1673
+ 3. proof-as-wink aside: naturally verifies the core claim, like a meta
1674
+ demo
1675
+ 4. customer/result proof aside: adds one short peer result when it would
1676
+ bloat the body but clearly increases believability. Customer/logo proof
1677
+ belongs here when it is legitimacy proof, not the main reason to reply. It
1678
+ must name what the customers used the product/service for, not just that
1679
+ they exist.
1680
+
1681
+ A PS must not explain strategy, defend the pitch, add a second unrelated
1682
+ offer, or say the quiet part out loud. Lines like `this is not just a
1683
+ platform idea` are blocked because they sound like internal rationale.
1684
+
1685
+ 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.
1686
+
1687
+ Rules:
1688
+
1689
+ - the PS must land a relevance hook — tie the proof directly to the buyer's pain or situation
1690
+ - the PS must read like a natural aside, not an artifact label. Block phrases
1691
+ like `p.s. relevant proof:`, `p.s. useful proof:`, `p.s. proof:`, and
1692
+ `p.s. social proof:`.
1693
+ - a meta-demo PS is valid when it increases confidence in the core claim by
1694
+ showing the product already did the thing the message says it can do
1695
+ - write the PS in a voice the reader can place:
1696
+ - if the **sender is the founder/operator**, write in `I` voice. Archive anchor: Superposition's `"I placed the first engineering hire at Brex."`
1697
+ - 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]."`
1698
+ - `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."`
1699
+ - **default to ONE proof beat** — the single beat that most directly answers "why is this sender a fit for my specific pain?"
1700
+ - 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):
1701
+ - the buyer's likely concern is "does this actually work reliably" → a beat about technical depth or track record strengthens the fit
1702
+ - the buyer's likely concern is "is this product durable / will the company be here in a year" → a named backing or capital beat strengthens the fit
1703
+ - the buyer's likely concern is "have you solved this for someone like me" → a named peer-customer beat (when safely available) strengthens the fit
1704
+ - if beat #1 already answers the buyer's primary question ("why does this sender understand my pain"), beat #2 needs to open a **new** dimension for the buyer. If it doesn't open a new dimension, it's a credential tack-on — cut it
1705
+ - no three-beat PS. No three-credential list. No title fragments like "CTO X led AI at Y"
1706
+ - close with the fit/relevance tag, not the credential. The last words should imply "that's why this might be worth 15 minutes," not "here's another bullet"
1707
+ - cut the PS entirely when:
1708
+ - the best available proof does not clearly say "this sender understands your situation"
1709
+ - the proof is purely credential without a relevance hook you can write in one sentence
1710
+ - the body already carries the mechanism and relevance and adding a PS would dilute rather than reinforce
1711
+ - except when the PS itself is the proof/demo that makes the core claim more believable
1712
+ - examples of good shapes (abstract — to be instantiated from the brief's safe-claims list, not copied):
1713
+ - `"Our CEO [ran a comparable operation before this], so the product is built for how [buyer-specific failure mode] actually breaks."`
1714
+ - `"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."`
1715
+ - `"Our team is backed by [named investor] because they're seeing the same [buyer pain] at every [segment] we talk to."`
1716
+ - examples of bad shapes (automatic revisions):
1717
+ - `"Alex did X. Jordan did Y."` — bare first names with no anchor, no relevance to the buyer's pain
1718
+ - `"CEO Alex, 2x founder. CTO Jordan, ex-FAANG."` — credential list, no relevance hook
1719
+ - `"Our team has deep [X] and [Y] experience."` — generic, no specifics
1720
+ - any PS that could be dropped without weakening the fit case — drop it instead
1721
+
1722
+ ### Safety
1723
+
1724
+ - reject unresolved `{{token}}`
1725
+ - reject unsupported new tokens not declared in the brief
1726
+ - reject invented proof, metrics, logos, customer names, or personalization
1727
+ - reject personalization that cannot be traced to `lead-sample.json`
1728
+ - keep proof claims inside the brief's safe-claims boundary
1729
+ - use only signals validated in `lead-sample.json`
1730
+ - pass the Thomas revision filters before returning
1731
+
1732
+ When token sourcing is weak:
1733
+
1734
+ - revise token fill rules
1735
+ - or revise the filter
1736
+ - or revise the message thesis
1737
+
1738
+ Do not guess.
1739
+
1740
+ ### `message-validation.md` Shape
1741
+
1742
+ ```md
1743
+ # Message Validation
1744
+
1745
+ Status: confirmed | revise-message | revise-filter
1746
+ Mode: DRY MODE (no DB mutation)
1747
+ Template Used: [template or thesis label from brief]
1748
+ Primary Example: [archived winner chosen]
1749
+ Secondary Influence: [optional CTA/proof/opener influence or none]
1750
+ Lead Sample Basis: [2-3 validated leads]
1751
+
1752
+ ## Strongest Reply Reason
1753
+
1754
+ - Strongest true thing we can say: ...
1755
+ - Why this buyer would care: ...
1756
+ - Packaging Rationale: [why this shape makes the reason feel human,
1757
+ interesting, and worth replying to; do not cite shape alone as the reason]
1758
+
1759
+ ## Pre-Draft Buyer-Role Analysis
1760
+
1761
+ - Buyer role / accountability: ...
1762
+ - Likely inbox objection: ...
1763
+ - Offer clarity sentence: ...
1764
+ - Sender identity rule: ...
1765
+ - Strongest proof and objection answered: ...
1766
+ - Lowest-friction true CTA: ...
1767
+ - Message thesis before drafting: ...
1768
+
1769
+ ## Campaign Element Pool
1770
+
1771
+ ### Sender Relevance Options
1772
+
1773
+ | Option | Line / Concept | Score | Keep / Reject | Reason |
1774
+ | ------ | -------------- | ----- | ------------- | ------ |
1775
+
1776
+ ### Buyer Problem Options
1777
+
1778
+ | Option | Problem | Score | Keep / Reject | Reason |
1779
+ | ------ | ------- | ----- | ------------- | ------ |
1780
+
1781
+ ### Offer Framing Options
1782
+
1783
+ | Option | Offer | Score | Keep / Reject | Reason |
1784
+ | ------ | ----- | ----- | ------------- | ------ |
1785
+
1786
+ ### Mechanism Framing Options
1787
+
1788
+ | Option | Mechanism | Score | Keep / Reject | Reason |
1789
+ | ------ | --------- | ----- | ------------- | ------ |
1790
+
1791
+ ### Proof Options
1792
+
1793
+ | Option | Proof | Role (`body-worthy` / `translated` / `CTA-asset` / `PS-worthy` / `internal-only`) | Score | Reason |
1794
+ | ------ | ----- | --------------------------------------------------------------------------------- | ----- | ------ |
1795
+
1796
+ ### CTA Options
1797
+
1798
+ | Option | CTA | Type | Score | Reason |
1799
+ | ------ | --- | ---- | ----- | ------ |
1800
+
1801
+ ### PS Options
1802
+
1803
+ | Option | PS | Job | Score | Reason |
1804
+ | ------ | --- | --- | ----- | ------ |
1805
+
1806
+ ## Gold Standard Strategy Map
1807
+
1808
+ | Example | Buyer Situation It Interrupts | Why Buyer Replies | Sender Relevance | Offer Clarity Move | Mechanism Clarity Move | Proof Role | CTA Job | Surface Traits Not To Copy |
1809
+ | ------- | ----------------------------- | ----------------- | ---------------- | ------------------ | ---------------------- | ---------- | ------- | -------------------------- |
1810
+
1811
+ ## Current Campaign Translation
1812
+
1813
+ - Equivalent buyer situation: ...
1814
+ - Equivalent strongest reply reason: ...
1815
+ - Equivalent sender relevance: ...
1816
+ - Equivalent offer: ...
1817
+ - Equivalent mechanism: ...
1818
+ - Equivalent proof role: ...
1819
+ - Equivalent CTA: ...
1820
+ - What would feel fake or overfit: ...
1821
+
1822
+ ## Element Scoring
1823
+
1824
+ - Best Strategy Combination: ...
1825
+ - Why this combination beats alternatives: ...
1826
+ - Rejected high-risk element: ...
1827
+ - Proof placement decision: body | translated | CTA asset | PS | internal-only
1828
+ - CTA / PS decision: single CTA | A/B CTA | PS | no PS — reason
1829
+
1830
+ ## Agent Dialogue Cross-Review
1831
+
1832
+ ### Skeptical Prospect
1833
+
1834
+ - Rejected before drafting: ...
1835
+ - Would keep reading because: ...
1836
+ - Biggest "so what?" risk: ...
1837
+ - CTA risk: ...
1838
+
1839
+ ### Offer Strategist
1840
+
1841
+ - Actual offer in plain English: ...
1842
+ - Buyer-side reason to care: ...
1843
+ - Product explanation: ...
1844
+ - Mechanism: ...
1845
+ - Proof treatment: ...
1846
+ - CTA job: ...
1847
+
1848
+ ### Gold-Standard Editor
1849
+
1850
+ - Closest gold motion: ...
1851
+ - Line jobs to preserve: ...
1852
+ - Surface traits not to copy: ...
1853
+ - Where current strategy could become weaker than gold: ...
1854
+
1855
+ ### Cross-Review Consensus
1856
+
1857
+ - Approved opener job: ...
1858
+ - Approved product explanation: ...
1859
+ - Approved mechanism: ...
1860
+ - Approved proof treatment: ...
1861
+ - Approved CTA shape: ...
1862
+ - Approved PS decision: ...
1863
+ - Banned elements before drafting: ...
1864
+
1865
+ ### Chosen Element Bank
1866
+
1867
+ - Opener strategy: ...
1868
+ - Offer sentence: ...
1869
+ - Mechanism sentence(s): ...
1870
+ - Proof beat: ...
1871
+ - CTA: ...
1872
+
1873
+ ## Per-Row Signal Inventory
1874
+
1875
+ | Row | Name / Company | Signal Category | Signal Verbatim | Strength |
1876
+ | --- | -------------- | --------------- | --------------- | -------- |
1877
+
1878
+ Signal Category values: `post-quote` | `profile-snippet` | `trigger` |
1879
+ `tool-keyword` | `peer-event` | `none`.
1880
+ Strength: `strong` (verbatim quote-back ready) | `medium` (paraphrase
1881
+ only) | `weak` (inferred from category) | `absent`.
1882
+ If every row in the sample lists `none`/`absent`, Findings MUST flag
1883
+ "signal-absent sample — real sends should enrich upstream before
1884
+ shipping this template".
1885
+
1886
+ ## Proof Inventory
1887
+
1888
+ - Mechanism: ...
1889
+ - Credibility / Social Proof: ...
1890
+ - Outcome Proof: ...
1891
+ - Deployment / Simplicity Proof: ...
1892
+ - Founder / Backing / Prior-Work Proof: ...
1893
+
1894
+ ## Token Fill Rules
1895
+
1896
+ | Token | Source Field | Allowed Transformation | Fallback | Result |
1897
+ | ----- | ------------ | ---------------------- | -------- | ------ |
1898
+
1899
+ If `{{company}}` or another account-context token is available, document
1900
+ whether it was tested as a believability personalization, not only whether it
1901
+ was technically available. Use it when it grounds a generic phrase without
1902
+ creating employer-blame, employer-permission, legal, or scrape-y risk. If it is
1903
+ omitted, state the specific reason it would not improve believability.
1904
+ Do not define or use `{{profile_signal}}`. Treat it as an internal enrichment
1905
+ classification only. When a profile-derived signal is genuinely useful, define
1906
+ a buyer-readable derived token such as `{{workflow_context}}` or
1907
+ `{{role_specialization}}` and show both its clean fill rule and omit fallback.
1908
+ When raw `{{company}}` is awkward but employer grounding still helps, define
1909
+ `{{employer_context}}` as a row-derived token: fill with the clean company name
1910
+ when natural, otherwise `your group`, `your bank`, `your team`, or the closest
1911
+ buyer-native account phrase. Do not silently fall back to generic language
1912
+ without documenting the transformation.
1913
+ Apply the same pattern to role, hiring, workflow, team/function, geography, and
1914
+ account-segment context. If the copy says a generic role/team/workflow and the
1915
+ row has a safe field for it, define the token and fallback before drafting.
1916
+ Examples:
1917
+
1918
+ - `{{hiring_role}}` = exact open role when clean; fallback `the role you're
1919
+ hiring for`
1920
+ - `{{role_specialization}}` = buyer-native specialization from title/headline;
1921
+ fallback broad role only when specialization is absent
1922
+ - `{{workflow_context}}` = concrete public workflow clue; fallback omitted, not
1923
+ generic filler
1924
+ - `{{account_segment}}` = row-derived account category when it improves fit;
1925
+ fallback brief-level segment only when every row shares it
1926
+
1927
+ ## Token Adherence Table
1928
+
1929
+ | Sample | Supported Tokens Only | All Tokens Resolved | Proof Safe | Personalization Grounded | Thomas Filters | Result |
1930
+ | ------ | --------------------- | ------------------- | ---------- | ------------------------ | -------------- | ------ |
1931
+
1932
+ ## Message Element Plan
1933
+
1934
+ - Base reusable pieces: ...
1935
+ - Optional sample-derived personalization pieces: ...
1936
+ - Personalization slots chosen: opener | soft bridge | proof | CTA | none
1937
+ - Casing / voice style: standard sentence case | casual lowercase common words
1938
+ - Sender-origin decision: include | omit | rewrite — reason
1939
+ - Proof placement decision: body | PS | CTA artifact | omitted — reason
1940
+ - PS decision: keep | test | omit — reason
1941
+ - Jargon / acronym decision: buyer-native | translate | omit — reason
1942
+
1943
+ | Element | Type (`base` / `sample-derived` / `omit`) | Source | Message Job | Planned Line / Rule | Decision |
1944
+ | ---------------- | ----------------------------------------- | ------------------- | ---------------- | ------------------- | --------------------- |
1945
+ | Greeting | base | lead sample | opener | ... | keep |
1946
+ | Sender relevance | base | brief | sender relevance | ... | keep / rewrite / omit |
1947
+ | Buyer problem | base | brief / lead review | buyer problem | ... | keep / rewrite / omit |
1948
+ | Product / offer | base | brief | product clarity | ... | keep / rewrite |
1949
+ | Mechanism | base | brief | mechanism | ... | keep / rewrite |
1950
+ | Proof | base | brief | proof | ... | body / PS / omit |
1951
+ | Personalization | sample-derived | lead sample | soft bridge | ... | use / test / omit |
1952
+ | CTA | base | brief | CTA | ... | keep / rewrite |
1953
+ | PS | base | brief | PS | ... | keep / omit |
1954
+
1955
+ ## Angle Drafts
1956
+
1957
+ ### Angle A
1958
+
1959
+ - Angle type: sender-origin | pain-removal | offer-first | mechanism-first | proof-translated | objection-handling | CTA-preview
1960
+ - Why this angle exists: ...
1961
+ - Target row: [name @ company, with row-specific signal quoted/paraphrased or category-only]
1962
+ - Substance Filter gate: PASS | BLOCKED (cite filter name + offending line)
1963
+ - Message: ...
1964
+
1965
+ ### Angle B
1966
+
1967
+ - Angle type: ...
1968
+ - Why this angle exists: ...
1969
+ - Target row: ...
1970
+ - Substance Filter gate: PASS | BLOCKED (cite filter name + offending line)
1971
+ - Message: ...
1972
+
1973
+ ### Angle C
1974
+
1975
+ - Angle type: ...
1976
+ - Why this angle exists: ...
1977
+ - Target row: ...
1978
+ - Substance Filter gate: PASS | BLOCKED (cite filter name + offending line)
1979
+ - Message: ...
1980
+
1981
+ ### Angle D
1982
+
1983
+ - Angle type: ...
1984
+ - Why this angle exists: ...
1985
+ - Target row: ...
1986
+ - Substance Filter gate: PASS | BLOCKED (cite filter name + offending line)
1987
+ - Message: ...
1988
+
1989
+ ### Angle E
1990
+
1991
+ - Angle type: ...
1992
+ - Why this angle exists: ...
1993
+ - Target row: ...
1994
+ - Substance Filter gate: PASS | BLOCKED (cite filter name + offending line)
1995
+ - Message: ...
1996
+
1997
+ ## Kill / Combine Review
1998
+
1999
+ | Angle | Keep / Combine / Reject | Reason | Best Piece To Reuse |
2000
+ | ----- | ----------------------- | ------ | ------------------- |
2001
+
2002
+ ## Finalists
2003
+
2004
+ ### Finalist 1
2005
+
2006
+ - Source parts: ...
2007
+ - Why this finalist exists: ...
2008
+ - Message: ...
2009
+
2010
+ ### Finalist 2
2011
+
2012
+ - Source parts: ...
2013
+ - Why this finalist exists: ...
2014
+ - Message: ...
2015
+
2016
+ ## Candidate Messages
2017
+
2018
+ ### Candidate A
2019
+
2020
+ - Why this candidate exists: ...
2021
+ - Target row: [name @ company, with row-specific signal quoted verbatim]
2022
+ - Substance Filter gate: PASS | BLOCKED (cite filter name + offending line)
2023
+ - Message: ...
2024
+
2025
+ ### Candidate B
2026
+
2027
+ - Why this candidate exists: ...
2028
+ - Target row: [name @ company, with row-specific signal quoted verbatim]
2029
+ - Substance Filter gate: PASS | BLOCKED (cite filter name + offending line)
2030
+ - Message: ...
2031
+
2032
+ ### Candidate C
2033
+
2034
+ - Why this candidate exists: ...
2035
+ - Target row: [name @ company, with row-specific signal quoted verbatim]
2036
+ - Substance Filter gate: PASS | BLOCKED (cite filter name + offending line)
2037
+ - Message: ...
2038
+
2039
+ ## Finalizer Pass
2040
+
2041
+ - Best opener: Candidate [A|B|C] — reason
2042
+ - Best proof sentence: Candidate [A|B|C] — reason
2043
+ - Best bridge: Candidate [A|B|C] — reason
2044
+ - Best CTA: Candidate [A|B|C] — reason
2045
+ - Best PS / no-PS decision: Candidate [A|B|C] — reason
2046
+ - Element edits made by finalizer: ...
2047
+ - Bullet-stack decision: used | rejected | not applicable — reason
2048
+ - Style consistency check: PASS | BLOCKED — reason
2049
+ - Assembly note: clean combination or one candidate swept
2050
+
2051
+ ## Optional Simplifier Pass
2052
+
2053
+ - Original winner: ...
2054
+ - Simplified candidate: ...
2055
+ - Simplifier edits: combined lines | split dense line | preserved bullet stack | added bullet stack | none
2056
+ - Bullet-stack decision: preserved | added | rejected | not applicable — reason
2057
+ - Robustness check: PASS | BLOCKED — reason
2058
+ - Decision: applied | rejected
2059
+
2060
+ ## Gold-Standard Quality Gate
2061
+
2062
+ - Believability: PASS | BLOCKED — reason
2063
+ - Legitimacy / scam-risk proof: PASS | BLOCKED | OMITTED — reason
2064
+ - Sender relevance: PASS | BLOCKED — reason
2065
+ - Non-assumption opener: PASS | BLOCKED — reason
2066
+ - No resume intro: PASS | BLOCKED — reason
2067
+ - Buyer-first opener: PASS | BLOCKED — reason
2068
+ - No bare founder intro: PASS | BLOCKED — reason
2069
+ - No `X here` sender intro: PASS | BLOCKED — reason
2070
+ - No semicolons in final copy: PASS | BLOCKED — reason
2071
+ - No adjacent repeated mechanism/pain terms: PASS | BLOCKED — reason
2072
+ - Element discipline: PASS | BLOCKED — reason
2073
+ - Product clarity: PASS | BLOCKED — reason
2074
+ - Proof naturalness: PASS | BLOCKED — reason
2075
+ - Read-aloud exactness: PASS | BLOCKED — reason
2076
+ - Jargon / acronym exactness: PASS | BLOCKED — reason
2077
+ - Style consistency: PASS | BLOCKED — reason
2078
+ - CTA truth: PASS | BLOCKED — reason
2079
+ - CTA clarity: PASS | BLOCKED — reason
2080
+ - PS restraint: PASS | BLOCKED | OMITTED — reason
2081
+ - YC / backing PS: PASS | BLOCKED | OMITTED — reason
2082
+ - Hard-to-fake proof used correctly: PASS | BLOCKED | OMITTED — reason
2083
+ - Gold-standard match: PASS | BLOCKED — reason
2084
+ - Decision: confirmed | revise-message | revise-filter
2085
+
2086
+ ## Skeptical Prospect Review
2087
+
2088
+ - Prospect lens: skeptical recipient who has been pitched similar products on LinkedIn hundreds of times
2089
+ - Biggest offer red flags: ...
2090
+ - why they would not believe it yet: ...
2091
+ - Legitimacy / scam concern: ...
2092
+ - What feels risky, unclear, or too good to be true: ...
2093
+ - Would they keep reading after line 1? PASS | BLOCKED — reason
2094
+ - Founder-story risk: PASS | BLOCKED — reason
2095
+ - Product/category clarity: PASS | BLOCKED — reason
2096
+ - Proof "so what?" risk: PASS | BLOCKED — reason
2097
+ - Anti-employer / anti-current-setup risk: PASS | BLOCKED — reason
2098
+ - CTA friction / trap risk: PASS | BLOCKED — reason
2099
+ - Decision: keep | rewrite | reject
2100
+
2101
+ ## Winner Gate
2102
+
2103
+ - Buyer understands sender relevance: PASS | BLOCKED — reason
2104
+ - Buyer understands product / offer: PASS | BLOCKED — reason
2105
+ - Buyer understands why it matters: PASS | BLOCKED — reason
2106
+ - Buyer believes the company / offer is real enough to engage: PASS | BLOCKED — reason
2107
+ - Proof improves the message: PASS | BLOCKED | OMITTED — reason
2108
+ - YC / backing PS improves reply odds: PASS | BLOCKED | OMITTED — reason
2109
+ - Hard-to-fake legitimacy proof is present when needed: PASS | BLOCKED | OMITTED — reason
2110
+ - No mind-reading from signals: PASS | BLOCKED — reason
2111
+ - No adjacent repetition: PASS | BLOCKED — reason
2112
+ - No semicolons or `X here` sender fragments: PASS | BLOCKED — reason
2113
+ - CTA is useful and low-friction: PASS | BLOCKED — reason
2114
+ - Every line has a prospect-side "so what?": PASS | BLOCKED — reason
2115
+ - Winner clearly beats rejected drafts: PASS | BLOCKED — reason
2116
+ - Decision: confirmed | revise-message | revise-filter
2117
+
2118
+ ## Selected Winner
2119
+
2120
+ - Winner: Candidate A | B | C | finalizer-remix
2121
+ - Why it won: axis (relevance | distinctiveness | proof | coherence | readability)
2122
+ - Lead: ...
2123
+ - Signals Used: ...
2124
+ - Tokens Used: ...
2125
+ - Message: ...
2126
+
2127
+ ## Findings
2128
+
2129
+ - ...
2130
+
2131
+ ## Recommendation
2132
+
2133
+ - proceed
2134
+ - revise-message
2135
+ - revise-filter
2136
+ ```
2137
+
2138
+ Automatic failures in dry mode:
2139
+
2140
+ - unresolved `{{token}}`
2141
+ - unsupported tokens not declared in the brief
2142
+ - invented proof or personalization
2143
+ - no compelling proof element despite the brief supporting one
2144
+ - a CTA that depends on missing proof
2145
+ - copy that fails the Thomas revision filters
2146
+ - any mutation tool usage
2147
+
2148
+ ## Workflow
2149
+
2150
+ ### Calibration Loop (recommended, not a hard gate)
2151
+
2152
+ Goal: lock tone + offer with 1-3 examples before scaling.
2153
+ Only hard requirement: draft at least one message before batch; saving examples is strongly recommended but optional.
2154
+
2155
+ Before drafting, read any Phase 75 brief-calibration assets already present:
2156
+
2157
+ - the campaign brief itself
2158
+ - any "Messaging Calibration" section saved back into the brief
2159
+ - any bounded copy appendix created through `create-campaign-brief`
2160
+ - token-fill and good/bad contrast examples when template-style personalization is in play
2161
+
2162
+ 1. Draft 1 message for a single lead (v1).
2163
+ 2. Ask what to change (tone, offer, wording) and what to keep.
2164
+ 3. If the user likes it, save as Example:
2165
+ - `update_cell(exampleCellId, true)`
2166
+ 4. Update the campaign brief with a "Messaging Calibration" section:
2167
+ - `get_campaign(campaignId)` to read current brief
2168
+ - `update_campaign_brief(campaignId, campaignBrief)` with:
2169
+ - Example(s): subject + body
2170
+ - Tone rules (dos/donts)
2171
+ - Offer framing notes
2172
+ - Opener / CTA guardrails
2173
+ - Token-fill notes when relevant
2174
+ 5. Ask whether to draft another example or proceed to batch.
2175
+
2176
+ If user wants to skip, proceed to batch but remind that examples improve quality.
2177
+
2178
+ The calibration loop above is for live campaign mode only. In dry mode, do not
2179
+ save examples, do not update the campaign brief, and do not convert validation
2180
+ into campaign state.
2181
+
2182
+ ### Zero-Shot Quality Reminder
2183
+
2184
+ The goal is not to rescue weak output with endless rewrites. If the draft is
2185
+ too generic, diagnose the gap precisely:
2186
+
2187
+ - ICP not sharp enough
2188
+ - offer too heavy
2189
+ - proof too vague
2190
+ - opener too pitchy
2191
+ - token fill too mechanical
2192
+
2193
+ Then tighten the brief or calibration notes before scaling.
2194
+
2195
+ Use the example bank as the primary strategy source even when the brief does
2196
+ not already contain winning examples. Do not default to generic REPLY-style
2197
+ copy when the motion clearly matches a tighter archived pattern. Strong
2198
+ references include:
2199
+
2200
+ - Sellable.dev
2201
+ - Galley
2202
+ - Gelee
2203
+ - HeyDigital
2204
+ - Revvix / Spektion
2205
+ - Superposition
2206
+ - Persona Digital
2207
+
2208
+ When the brief is sparse but the motion clearly matches an archived winner,
2209
+ borrow the closest message shape from
2210
+ `gold-standard-message-examples.md` before inventing a new structure.
2211
+
2212
+ ### Single Row
2213
+
2214
+ 1. Load campaign examples, calibration notes, and bounded copy from the brief first.
2215
+ 2. Load the REPLY framework prompt with `get_message_prompt` only as a fallback
2216
+ structure and QA backstop when the brief lacks a concrete pattern.
2217
+ 3. Fetch lead details via `get_rows`.
2218
+ 4. Draft a message, show it with a full 12-gate check.
2219
+ 5. If the message cell is empty, auto-save the draft with `update_cell` and say "Draft saved (not approved)."
2220
+ 6. If the message cell has content, ask before overwriting; only save on explicit confirmation.
2221
+ 7. Ask whether to approve, and if yes, set the approve cell.
2222
+ 8. Ask whether to save as Example (exampleCellId) and update the campaign brief.
2223
+
2224
+ ### Batch Mode (Multiple Rows)
2225
+
2226
+ When crafting messages for multiple rows (e.g., "craft rows 1-5"):
2227
+
2228
+ **CRITICAL: Use parallel subagents for efficiency.**
2229
+
2230
+ 1. Load campaign examples, calibration notes, and bounded copy from the brief first.
2231
+ 2. Call `get_message_prompt()` once to get the fallback REPLY framework and QA checks
2232
+ 3. Spawn parallel subagents using the `Task` tool with explicit `model: "opus"` and `subagent_type: "general-purpose"` (never omit model):
2233
+
2234
+ ```
2235
+ For each row (1-5), launch a Task subagent:
2236
+ - subagent_type: "general-purpose"
2237
+ - model: "opus"
2238
+ - prompt: Include campaign context, sender info, row data, gold-standard message examples when present, and fallback REPLY framework
2239
+ - Do NOT use run_in_background (avoids notification spam)
2240
+ ```
2241
+
2242
+ 4. Each subagent:
2243
+
2244
+ - Researches the prospect (WebSearch, LinkedIn tools)
2245
+ - Crafts message by following the campaign's gold-standard pattern first
2246
+ - Uses the proof-led specialist fallback when the campaign lacks a stronger validated hook
2247
+ - Uses the fallback REPLY framework only as structure and QA support
2248
+ - Returns the draft + research notes (do NOT save)
2249
+
2250
+ 5. Wait for all subagents to complete
2251
+ 6. Auto-save drafts for rows where the message cell is empty (announce "Draft saved (not approved)")
2252
+ 7. Show summary:
2253
+
2254
+ ```
2255
+ Crafted 5/5 messages:
2256
+
2257
+ | Row | Name | Status | Preview |
2258
+ |-----|------|--------|---------|
2259
+ | 1 | John | ✅ Saved | "Saw your post about..." |
2260
+ | 2 | Sarah | ✅ Saved | "Love what you're doing..." |
2261
+ ...
2262
+
2263
+ Approve all for sending?
2264
+ - Yes, approve all
2265
+ - Review individually first
2266
+ ```
2267
+
2268
+ ### Subagent Prompt Template
2269
+
2270
+ When spawning craft subagents, include:
2271
+
2272
+ ```
2273
+ Craft a personalized LinkedIn message for this prospect using the campaign's
2274
+ gold-standard examples first, then the Doctor Strange method only as needed:
2275
+ research → condense → 10 angle agents in parallel → finalizer combines best elements.
2276
+
2277
+ ## Campaign Context
2278
+ {brief, positioning, dos/donts, calibration notes (if present)}
2279
+
2280
+ ## Sender
2281
+ - Name: {name} | Company: {company} | Title: {title}
2282
+ - Core thesis: {1 line from styleguide-core.md}
2283
+ - Signature phrases: {3-5 key phrases}
2284
+ - Background: {1-2 lines}
2285
+
2286
+ ## Voice + Outbound Rules (condensed — full files available via Read tool)
2287
+ - Flow skeleton: opener → pain → **what the product IS** → **what it DOES** (one action per line, up to three) → deployment ease → CTA → optional PS
2288
+ - 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"
2289
+ - 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
2290
+ - 5th-grade reading level by default. Cut glue language (handoff, order-to-cash, rip-and-replace). Keep brief-native product/tool names (Shopify, HubSpot)
2291
+ - No bullet points, no "I noticed...", no compliment sandwiches, no em dashes unless the canonical example uses one
2292
+ - No synthesized framing ("at your stage", "in a setup like yours", "running X means...", "X means you're likely...")
2293
+ - 3 candidates then `Finalizer Pass` — pick best opener, proof sentence, bridge, CTA across them and assemble the winner
2294
+ - 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
2295
+ - Sound like a human peer, not a salesperson
2296
+
2297
+ ## Cross-Skill Insights
2298
+ {2-3 bullets from cross-skill.md}
2299
+
2300
+ ## Prospect (Row #{n})
2301
+ - Name: {name}
2302
+ - Company: {company}
2303
+ - Title: {title}
2304
+ - LinkedIn: {linkedinUrl}
2305
+ - Current message: {current or "[empty]"}
2306
+ - messageCellId: {cellId}
2307
+ - tableId: {tableId}
2308
+
2309
+ ## Gold-Standard Message Examples
2310
+ {best campaign-native examples, interpolation rules, and dos/donts from the brief}
2311
+
2312
+ ## Gold-Standard Strategy Patterns
2313
+ {event-led, signal-led, job-post-led, and proof-led specialist fallback rules from gold-standard-message-patterns.md}
2314
+
2315
+ ## Fallback REPLY Framework
2316
+ {full prompt from get_message_prompt()}
2317
+
2318
+ ## Instructions
2319
+ 1. Research the prospect (WebSearch, LinkedIn tools if needed)
2320
+ 2. Choose the highest-specificity validated strategy available in this order:
2321
+ - event-led
2322
+ - signal-led
2323
+ - job-post-led
2324
+ - proof-led specialist fallback
2325
+ 3. Follow the gold-standard examples first when they exist. Preserve structure,
2326
+ proof ordering, CTA shape, and subject style unless the prospect data makes
2327
+ that impossible.
2328
+ 4. If forced into proof-led specialist fallback:
2329
+ - use buyer-language workflow terms from the brief
2330
+ - lead with specialization or the specific workflow problem, not a generic
2331
+ "most teams..." opener
2332
+ - make the mechanism concrete
2333
+ - use the strongest safe proof
2334
+ - make the CTA a useful next step, not a vague meeting ask
2335
+ 5. Build a condensed angle brief (~1.5k tokens) from research + sender info
2336
+ 6. Fan out 10 angle agents (model: "sonnet", run_in_background: true):
2337
+ - Each gets the condensed brief + their angle instruction (~2k tokens per agent)
2338
+ - DO NOT pass the full fallback REPLY framework to angle agents, only the brief
2339
+ 7. After all 10 return, act as the Finalizer:
2340
+ - Combine the best opener, bridge, body, and CTA across all drafts
2341
+ - Credibility pass: must say something they haven't heard from 50 other people
2342
+ - Voice-check against sender's signature phrases
2343
+ - Reject generic fallback openers and abstract noun subjects when the
2344
+ specialist fallback can be made more concrete
2345
+ - Run full 12-gate check using the fallback REPLY framework as QA only, all must pass
2346
+ 8. Return: { success: true, message: "...", research: [...], anglesExplored: 10 }
2347
+ ```
2348
+
2349
+ **IMPORTANT:** Load `.sellable/configs/writing/outbound.md`, `styleguide-core.md`, and `.sellable/insights/cross-skill.md` ONCE in the lead agent, then pass **condensed** versions to subagents. Don't pass full file contents to every subagent — that wastes context and causes overflow.
2350
+
2351
+ ## Batch Approval
2352
+
2353
+ After batch generation, user can approve all:
2354
+
2355
+ ```
2356
+ update_cell(approveCellId1, true)
2357
+ update_cell(approveCellId2, true)
2358
+ ...
2359
+ ```
2360
+
2361
+ Or approve individually after reviewing in UI.