@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.
- package/.claude-plugin/plugin.json +12 -0
- package/.mcp.json +9 -0
- package/README.md +355 -0
- package/dist/api.d.ts +21 -0
- package/dist/api.js +73 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.js +246 -0
- package/dist/engage-memory.d.ts +63 -0
- package/dist/engage-memory.js +354 -0
- package/dist/index-dev.d.ts +2 -0
- package/dist/index-dev.js +17 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +499 -0
- package/dist/skills.d.ts +11 -0
- package/dist/skills.js +97 -0
- package/dist/tools/auth.d.ts +30 -0
- package/dist/tools/auth.js +124 -0
- package/dist/tools/blueprint-commit.d.ts +174 -0
- package/dist/tools/blueprint-commit.js +286 -0
- package/dist/tools/bootstrap.d.ts +64 -0
- package/dist/tools/bootstrap.js +246 -0
- package/dist/tools/campaigns.d.ts +589 -0
- package/dist/tools/campaigns.js +892 -0
- package/dist/tools/cells.d.ts +58 -0
- package/dist/tools/cells.js +48 -0
- package/dist/tools/context.d.ts +88 -0
- package/dist/tools/context.js +271 -0
- package/dist/tools/csv-domains.d.ts +73 -0
- package/dist/tools/csv-domains.js +464 -0
- package/dist/tools/csv-linkedin.d.ts +102 -0
- package/dist/tools/csv-linkedin.js +712 -0
- package/dist/tools/direct-campaigns.d.ts +240 -0
- package/dist/tools/direct-campaigns.js +250 -0
- package/dist/tools/engage-bootstrap.d.ts +94 -0
- package/dist/tools/engage-bootstrap.js +205 -0
- package/dist/tools/engage-discovery.d.ts +78 -0
- package/dist/tools/engage-discovery.js +150 -0
- package/dist/tools/engage-memory.d.ts +181 -0
- package/dist/tools/engage-memory.js +143 -0
- package/dist/tools/engage-state.d.ts +72 -0
- package/dist/tools/engage-state.js +62 -0
- package/dist/tools/enrichment.d.ts +167 -0
- package/dist/tools/enrichment.js +174 -0
- package/dist/tools/flow-preflight.d.ts +68 -0
- package/dist/tools/flow-preflight.js +138 -0
- package/dist/tools/framework.d.ts +44 -0
- package/dist/tools/framework.js +153 -0
- package/dist/tools/interaction-mode.d.ts +27 -0
- package/dist/tools/interaction-mode.js +102 -0
- package/dist/tools/leads.d.ts +2417 -0
- package/dist/tools/leads.js +2307 -0
- package/dist/tools/linkedin.d.ts +210 -0
- package/dist/tools/linkedin.js +229 -0
- package/dist/tools/navigation.d.ts +91 -0
- package/dist/tools/navigation.js +381 -0
- package/dist/tools/one-off.d.ts +229 -0
- package/dist/tools/one-off.js +273 -0
- package/dist/tools/processing.d.ts +70 -0
- package/dist/tools/processing.js +56 -0
- package/dist/tools/prompts.d.ts +211 -0
- package/dist/tools/prompts.js +210 -0
- package/dist/tools/provider-preflight.d.ts +21 -0
- package/dist/tools/provider-preflight.js +59 -0
- package/dist/tools/readiness.d.ts +261 -0
- package/dist/tools/readiness.js +510 -0
- package/dist/tools/rows.d.ts +126 -0
- package/dist/tools/rows.js +105 -0
- package/dist/tools/rubrics.d.ts +497 -0
- package/dist/tools/rubrics.js +681 -0
- package/dist/tools/senders.d.ts +44 -0
- package/dist/tools/senders.js +69 -0
- package/dist/tools/sequencer.d.ts +127 -0
- package/dist/tools/sequencer.js +194 -0
- package/dist/tools/tables.d.ts +35 -0
- package/dist/tools/tables.js +36 -0
- package/dist/tools/verify-row.d.ts +36 -0
- package/dist/tools/verify-row.js +38 -0
- package/dist/tools/workspaces.d.ts +140 -0
- package/dist/tools/workspaces.js +139 -0
- package/dist/utils/workspace-root.d.ts +1 -0
- package/dist/utils/workspace-root.js +39 -0
- package/package.json +46 -0
- package/skills/building-gtm-tables/SKILL.md +216 -0
- package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
- package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
- package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
- package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
- package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
- package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
- package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
- package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
- package/skills/building-gtm-tables/references/verify-loop.md +74 -0
- package/skills/campaign-messages/SKILL.md +173 -0
- package/skills/campaign-messages/flow.v1.json +75 -0
- package/skills/craft-message/SKILL.md +401 -0
- package/skills/create-campaign/ARCHITECTURE.md +232 -0
- package/skills/create-campaign/DISCUSS.md +296 -0
- package/skills/create-campaign/FLOW_ASCII.md +240 -0
- package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
- package/skills/create-campaign/README.md +142 -0
- package/skills/create-campaign/SKILL.md +286 -0
- package/skills/create-campaign/context/README.md +67 -0
- package/skills/create-campaign/context/_TEMPLATE.md +12 -0
- package/skills/create-campaign/context/context.md +35 -0
- package/skills/create-campaign/context/learnings.md +16 -0
- package/skills/create-campaign/context/registry.json +19 -0
- package/skills/create-campaign/core/flow.v1.json +217 -0
- package/skills/create-campaign/core/policy.md +191 -0
- package/skills/create-campaign/core/providers/apollo.json +35 -0
- package/skills/create-campaign/core/providers/prospeo.json +34 -0
- package/skills/create-campaign/core/providers/registry.json +31 -0
- package/skills/create-campaign/core/providers/sales-nav.json +37 -0
- package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
- package/skills/create-campaign/references/brief-template.md +64 -0
- package/skills/create-campaign/references/campaign-quality.md +84 -0
- package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
- package/skills/create-campaign/references/offer-patterns.md +108 -0
- package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
- package/skills/create-campaign/references/question-examples.md +167 -0
- package/skills/create-campaign/references/token-fill-examples.md +81 -0
- package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
- package/skills/create-campaign-brief/DISCUSS.md +64 -0
- package/skills/create-campaign-brief/README.md +176 -0
- package/skills/create-campaign-brief/SKILL.md +537 -0
- package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
- package/skills/create-campaign-brief/references/brief-template.md +220 -0
- package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
- package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
- package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
- package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
- package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
- package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
- package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
- package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
- package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
- package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
- package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
- package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
- package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
- package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
- package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
- package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
- package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
- package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
- package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
- package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
- package/skills/create-campaign-v2/SKILL.md +1619 -0
- package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
- package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
- package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
- package/skills/create-campaign-v2/core/policy.md +82 -0
- package/skills/create-campaign-v2/references/ai-tells.md +253 -0
- package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
- package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
- package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
- package/skills/create-campaign-v2/references/filter-leads.md +495 -0
- package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
- package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
- package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
- package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
- package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
- package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
- package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
- package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
- package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
- package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
- package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
- package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
- package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
- package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
- package/skills/create-campaign-v2-validation/SKILL.md +296 -0
- package/skills/create-post/SKILL.md +1308 -0
- package/skills/create-rubric/SKILL.md +251 -0
- package/skills/engage/SKILL.md +549 -0
- package/skills/engage/core/README.md +23 -0
- package/skills/engage/core/proven-searches.json +11 -0
- package/skills/engage/core/style-guide.template.md +47 -0
- package/skills/engage/core/tracked-people.json +10 -0
- package/skills/enrich-prospects/SKILL.md +97 -0
- package/skills/find-leads/SKILL.md +467 -0
- package/skills/generate-messages/SKILL.md +2361 -0
- package/skills/interview/SKILL.md +132 -0
- package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
- package/skills/interview/core/ICP.template.md +54 -0
- package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
- package/skills/providers/apollo.md +520 -0
- package/skills/providers/prospeo.md +398 -0
- package/skills/providers/sales-nav.md +372 -0
- package/skills/providers/signal-discovery.md +495 -0
- package/skills/research/SKILL.md +258 -0
- package/skills/research/config.json +9 -0
- package/skills/research/override.md +13 -0
- package/skills/research-prospect/SKILL.md +99 -0
- package/skills/research-sender/SKILL.md +158 -0
- 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.
|