@sellable/mcp 0.1.213 → 0.1.215

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/agents/post-find-leads-message-scout.md +190 -151
  2. package/dist/tools/prompts.js +18 -13
  3. package/package.json +1 -1
  4. package/skills/create-campaign/SKILL.md +11 -12
  5. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +3 -3
  6. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +16 -28
  7. package/skills/create-campaign-v2/SKILL.md +12 -9
  8. package/skills/create-campaign-v2/core/auto-execute.README.md +11 -11
  9. package/skills/create-campaign-v2/core/auto-execute.yaml +4 -4
  10. package/skills/create-campaign-v2/core/flow.v2.json +1 -1
  11. package/skills/create-campaign-v2/references/ai-tells.md +3 -3
  12. package/skills/create-campaign-v2/references/approval-gate-framing.md +9 -9
  13. package/skills/create-campaign-v2/references/escalation-ladder.md +3 -3
  14. package/skills/create-campaign-v2/references/final-handoff-contract.md +3 -3
  15. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +294 -239
  16. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +13 -9
  17. package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +4 -4
  18. package/skills/create-campaign-v2/references/lead-validation-preview.md +1 -1
  19. package/skills/create-campaign-v2/references/parallel-critique-protocol.md +10 -10
  20. package/skills/create-campaign-v2/references/sample-validation-loop.md +3 -3
  21. package/skills/create-campaign-v2/references/{thomas-revision-filters.md → sellable-cleanup-rules.md} +13 -12
  22. package/skills/create-campaign-v2/references/step-15-re-cascade.md +1 -1
  23. package/skills/create-campaign-v2/references/thomas-variant-selection.md +1 -1
  24. package/skills/create-campaign-v2/references/validation-criteria.md +16 -13
  25. package/skills/create-campaign-v2-tail/SKILL.md +7 -7
  26. package/skills/create-campaign-v2-validation/SKILL.md +17 -8
  27. package/skills/generate-messages/SKILL.md +157 -93
  28. package/skills/research/config.json +9 -0
  29. package/skills/create-campaign-v2/references/gold-standard-runtime-message-pack.md +0 -252
@@ -6,10 +6,11 @@ visibility: internal
6
6
 
7
7
  # Generate Messages
8
8
 
9
- You craft messages in one of two modes:
9
+ You craft row-level messages in two active modes:
10
10
 
11
11
  - live campaign mode for selected leads in a real campaign table
12
- - caller-declared DRY MODE for Phase 84 validation artifacts before any live campaign exists
12
+ - caller-declared DRY MODE for offline validation artifacts before any live
13
+ campaign exists
13
14
 
14
15
  ## Tools
15
16
 
@@ -28,37 +29,35 @@ You craft messages in one of two modes:
28
29
 
29
30
  ### Mode 0: Message Drafting Branch
30
31
 
31
- Use this mode when create-campaign-v2 starts background Message Drafting after
32
- `confirm_lead_list` copies source rows and the first
33
- review/process sample exists.
34
- This is not the row-cell generation path.
35
-
36
- Inputs must come from the parent thread or scoped MCP/product tools for the
37
- current workspace/campaign:
38
-
39
- - campaign id plus campaign revision or `updatedAt`
40
- - current campaign brief and a brief hash
41
- - selected source state and `selectedLeadListId`
42
- - `workflowTableId`
43
- - imported review-batch contacts, row ids, and review-batch row hash
44
- - filter choice at branch start, plus filter/rubric basis when present
32
+ Use `generate-messages` for the campaign workflow's live template
33
+ recommendation branch after the source list is copied into the campaign table
34
+ and the first non-empty execution slice exists. This is not the row-cell
35
+ generation path. Before drafting, that branch must also load the required
36
+ message assets through Sellable MCP tools:
37
+
38
+ - `create-campaign-v2/references/gold-standard-message-examples.md`
39
+ - `create-campaign-v2/references/gold-standard-message-patterns.md`
40
+ - `create-campaign-v2/references/ai-tells.md`
41
+ - `create-campaign-v2/references/sellable-cleanup-rules.md`
42
+ - `create-campaign/references/ai-native-tokens.md`
43
+ - `create-campaign/references/token-fill-examples.md`
44
+
45
+ After candidate generation and revision, and before returning `ready`, load
46
+ `create-campaign-v2-validation` through Sellable MCP as the final gate.
47
+
48
+ Never reconstruct that branch from `brief.md`, `lead-review.md`,
49
+ `lead-sample.json`, `lead-filter.md`, `message-validation.md`, local files, or
50
+ direct database reads. If any required message asset cannot be loaded through MCP
51
+ before drafting, return `blocked` or `retry-needed`. If the validation prompt
52
+ cannot be loaded after generation, or the candidate fails that final gate, return
53
+ `blocked` or `retry-needed`.
45
54
 
46
55
  Reject the branch as blocked if the campaign id, selected lead list, workflow
47
- table, or review-batch row ids/hash do not match. Do not reconstruct state from
48
- stale local markdown artifacts or direct database reads.
49
-
50
- Before drafting, load the packaged reference assets in "Reference Asset Loading"
51
- below through `mcp__sellable__get_subskill_asset`. In customer/package runs,
52
- the `mcp/sellable/skills/...` strings are asset identifiers, not local files.
53
- Do not use shell commands, local `Read`, `rg`, `cat`, `wc`, plugin-cache paths,
54
- repo paths, or `/Users/...` paths to load them. If a required asset cannot be
55
- loaded through the MCP asset loader, return `blocked` or `retry-needed` instead
56
- of drafting from memory.
57
-
58
- Return message-draft output only: template recommendation, token fill rules,
59
- rendered sample, concerns, status, basis token, output timestamp/hash, and error or
60
- retry detail. Do not write message cells, enrich rows, update the campaign
61
- brief, attach sequence, or imply send readiness from this branch.
56
+ table, or initial execution-slice rows do not match. Return message-draft output
57
+ only: template recommendation, token fill rules, rendered good sample, status,
58
+ basis token, output timestamp/hash, and blocked/retry detail when applicable.
59
+ Do not write message cells, enrich rows, update the campaign brief, attach a
60
+ sequence, or imply send readiness from this branch.
62
61
 
63
62
  ### Mode 1: Live Campaign Mode
64
63
 
@@ -92,18 +91,18 @@ to live mode drafts, with live-mode-specific allowances:
92
91
  - personalization from research is allowed, but it does not replace the
93
92
  "what the product IS" / "what it DOES" anchors
94
93
  - save behavior and calibration loop follow the live-mode workflow below,
95
- but the drafted message itself is subject to the same Thomas revision
94
+ but the drafted message itself is subject to the same Sellable cleanup
96
95
  filters as dry mode
97
96
 
98
97
  ### Mode 2: Caller-Declared DRY MODE
99
98
 
100
- Use this mode when the caller explicitly says `DRY MODE`, `Phase 84`,
99
+ Use this mode when the caller explicitly says `DRY MODE`, `offline validation`,
101
100
  `create-campaign-v2`, or provides:
102
101
 
103
102
  - `brief.md`
104
103
  - `lead-sample.json`
105
- - `lead-filter.md` when available. In the create-campaign-v2
106
- Prospect Setup step, message generation may start before
104
+ - `lead-filter.md` when available. In the campaign workflow's post-lead
105
+ workstream, message generation may start before
107
106
  `lead-filter.md` exists so it can prepare proof inventory, token strategy,
108
107
  and candidate angles while filter-leads runs.
109
108
 
@@ -139,7 +138,7 @@ Required dry-mode contract:
139
138
  If the dry-mode response is missing the no-mutation preamble, treat that as a
140
139
  hard failure and revise the output before returning it.
141
140
 
142
- ## Phase 84 Dry-Mode Validation
141
+ ## Offline Validation
143
142
 
144
143
  Dry mode validates message quality before campaign mint.
145
144
 
@@ -158,17 +157,17 @@ Read these campaign inputs:
158
157
  - `lead-filter.md` when present. If it is absent because the caller launched
159
158
  prospect setup workstreams in parallel, start the prep/candidate stages and then
160
159
  reconcile before final `message-validation.md`.
161
-
162
160
  ## Reference Asset Loading (do this before drafting)
163
161
 
164
162
  Do not draft from this prompt alone. The full `generate-messages` prompt is
165
163
  only the contract; the reference assets below are the evidence and examples
166
- that define the desired output. Before writing angle drafts, you MUST load the
167
- required pre-draft reference pack below with `mcp__sellable__get_subskill_asset`.
168
- This is a hard gate: if the four required pre-draft assets are not loaded,
164
+ that define the desired output. Before writing angle drafts, you MUST load every
165
+ required pre-draft reference below with `mcp__sellable__get_subskill_asset`.
166
+ This is the required pre-draft reference pack for Mode 0 message drafting.
167
+ This is a hard gate: if the required pre-draft assets are not loaded,
169
168
  return `blocked` / `retry-needed` instead of drafting. Write a short
170
- `Reference Asset Loading` note naming each loaded asset and whether it was
171
- required pre-draft, final-pass, dry-mode-only, or token-rules-only. Do not
169
+ internal `Reference Asset Loading` note naming each loaded asset and whether it
170
+ was required pre-draft, dry-mode-only, or token-rules-only. Do not
172
171
  bulk-load the conditional references unless their trigger applies or the caller
173
172
  explicitly asks for maximum context over speed.
174
173
 
@@ -176,21 +175,22 @@ Use `mcp__sellable__get_subskill_asset` for packaged assets:
176
175
 
177
176
  | Group | Asset to load | Job |
178
177
  | --- | --- | --- |
179
- | Always load before drafting | `subskillName: "create-campaign-brief", assetPath: "references/phase75-active-runtime-message-pack.md"` | Active line-level gold pack: real approved examples, short-line rhythm, CTA blocks, lowercase/titlecase cues, and PS restraint. |
178
+ | Always load before drafting | `subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-examples.md"` | Active line-level gold pack. Full archive quality bar: exact motion examples, hard rules, and transfer limits. Use it to choose 1 primary example, not to recolor copy. |
180
179
  | Always load before drafting | `subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-patterns.md"` | Strategy selector: event-led vs signal-led vs job-post-led vs proof-led fallback, proof inventory, candidate set, and Finalizer Pass. |
181
- | Always load before drafting | `subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-examples.md"` | Full archive quality bar: exact motion examples, hard rules, and transfer limits. Use it to choose 1 primary example, not to recolor copy. |
182
180
  | Always load before drafting (never optional) | `subskillName: "create-campaign-v2", assetPath: "references/ai-tells.md"` | Canonical anti-AI checklist: body self-intros, source citations, resume recaps, title-fit assumptions, em dashes, signoffs, weak proof brags, and flattened "worth sending" source bridges. |
183
- | Load before approval / final pass | `subskillName: "create-campaign-v2", assetPath: "references/thomas-revision-filters.md"` | Substance filters: earned-right, presumption, vague proof, read-as-1:1, founder-origin coherence, anti-talk-at, and AI-tell filter. |
181
+ | Load before approval / final pass | `subskillName: "create-campaign-v2", assetPath: "references/sellable-cleanup-rules.md"` | Substance filters: earned-right, presumption, vague proof, read-as-1:1, founder-origin coherence, anti-talk-at, AI-tell filter, line continuity, PS shape, and proof safety. |
182
+ | Reusable token rules only | `subskillName: "create-campaign", assetPath: "references/ai-native-tokens.md"` | Token spec for rich judgment tokens, including required clauses and fallback behavior. Always load before reusable template/token rules. |
183
+ | Reusable token rules only | `subskillName: "create-campaign", assetPath: "references/token-fill-examples.md"` | Concrete good/bad token fills, interpolation guardrails, and product-noun substitution traps. Always load before reusable template/token rules. |
184
184
  | Dry-mode artifact output only | `subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-validation-example.md"` | Fully worked example for proof inventory, candidate messages, Finalizer Pass, Selected Winner, findings, and recommendation. |
185
185
  | Dry-mode artifact output only | `subskillName: "create-campaign-v2", assetPath: "references/validation-criteria.md"` | Step-level acceptance criteria and dry-mode message validation expectations. |
186
- | Reusable token rules only | `subskillName: "create-campaign", assetPath: "references/ai-native-tokens.md"` | Token spec for rich judgment tokens, including required clauses and fallback behavior. |
187
- | Reusable token rules only | `subskillName: "create-campaign", assetPath: "references/token-fill-examples.md"` | Concrete good/bad token fills, interpolation guardrails, and product-noun substitution traps. |
188
186
 
189
187
  Example packaged asset calls:
190
188
 
191
189
  - `get_subskill_asset({ subskillName: "create-campaign", assetPath: "references/ai-native-tokens.md" })`
192
190
  - `get_subskill_asset({ subskillName: "create-campaign", assetPath: "references/token-fill-examples.md" })`
193
191
  - `get_subskill_asset({ subskillName: "create-campaign-brief", assetPath: "references/phase75-active-runtime-message-pack.md" })`
192
+ - `get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-examples.md" })`
193
+ - `get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/sellable-cleanup-rules.md" })`
194
194
  - `get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/validation-criteria.md" })`
195
195
 
196
196
  Do not satisfy the list above by searching or reading the local filesystem.
@@ -198,18 +198,18 @@ Path-like names in this section are package asset coordinates for MCP loading.
198
198
 
199
199
  Default load order:
200
200
 
201
- 1. Load the 4 **Always load before drafting** assets. Do not infer their
201
+ 1. Load the **Always load before drafting** assets. Do not infer their
202
202
  contents from this prompt; actually call `mcp__sellable__get_subskill_asset`
203
203
  for each required asset.
204
204
  2. Draft and run the internal Finalizer Pass.
205
205
  3. Run the selected winner against `ai-tells.md`. This is never optional. If the
206
206
  AI-tells catalog was not loaded or any `REJECT` tell matches, do not approve,
207
207
  confirm, recommend, or show the template as ready; return `revise-message`.
208
- 4. Load `thomas-revision-filters.md` before approval, `confirmed`, or template
209
- recommendation.
208
+ 4. Run the selected winner against `sellable-cleanup-rules.md` before approval,
209
+ `confirmed`, or template recommendation.
210
210
  5. Load dry-mode artifact references only when writing `message-validation.md`.
211
- 6. Load token-rule references only when creating reusable templates or Token
212
- Fill Rules that need sentence-level personalization.
211
+
212
+ Do not load retired branch/runtime packs.
213
213
 
214
214
  ### Rich Personalization Contract
215
215
 
@@ -255,14 +255,16 @@ winner gate**.
255
255
 
256
256
  ### Retrieval & motion
257
257
 
258
- - treat `gold-standard-runtime-message-pack.md` as the **real line-level
259
- gold pack** for active clients and proven live message shapes
260
- - retrieve against the full archived gold-standard library and pick the closest 2-4 examples for consideration
261
- - use the runtime pack first for concrete formatting cues that the
262
- abstract archive may flatten away: lowercase vs title case, exact
263
- `two options:` formatting, short line rhythm, and load-bearing
264
- `p.s.` lines
265
- - treat the archive as the **quality bar and motion reference**, not a paste source. Your job is to write a new message that could plausibly belong in the archive, not to recolor an existing one
258
+ - treat `gold-standard-message-examples.md` as the canonical examples asset for
259
+ both primary runtime examples and conditional motion references
260
+ - retrieve against the primary runtime examples first, then conditional examples
261
+ only when the campaign motion matches
262
+ - use the examples for concrete formatting cues that abstract patterns may
263
+ flatten away: lowercase vs title case, exact `two options:` formatting, short
264
+ line rhythm, and load-bearing `p.s.` lines
265
+ - treat the examples as the **quality bar and motion reference**, not a paste
266
+ source. Your job is to write a new message that could plausibly belong in the
267
+ archive, not to recolor an existing one
266
268
  - before choosing any example, name the **strongest true reason this buyer
267
269
  should reply**. This is the north star: the most compelling safe mechanism,
268
270
  proof, asset, diagnostic, offer, or buyer outcome available from the brief and
@@ -282,7 +284,7 @@ winner gate**.
282
284
  packaging tools. Use them only when they make the strongest true reason more
283
285
  compelling or easier to reply to.
284
286
  - **exact-template preservation only applies when the archived winner is the same company as the brief** (e.g., Superposition drafting for Superposition). In that case preserve casing, spacing, CTA shape, and proof ordering, and change only the documented tokens. For every other case, match the quality bar and motion shape; do not recolor the exemplar's wording
285
- - if the runtime pack shows a proven same-company or same-motion line that is
287
+ - if the examples file shows a proven same-company or same-motion line that is
286
288
  doing real work, do not silently flatten it away in the name of generic
287
289
  cleanliness
288
290
  - choose the highest-specificity validated strategy available: event-led, signal-led, job-post-led, then proof-led specialist fallback (full patterns in `gold-standard-message-patterns.md`)
@@ -405,11 +407,42 @@ artifact.**
405
407
  - `saw you raise your hand for {{signal_topic}}, so figured this was (hopefully) worth sending` only when the source was an explicit lead-magnet comment, reply, or opt-in. The parenthetical uncertainty is load-bearing; do not flatten it to `so figured this was worth sending`.
406
408
  - `saw you raise your hand for {{signal_topic}} (creepy to reach out based on that, i know) - but this felt too on the nose to ignore` only when the source was an explicit lead-magnet comment, reply, or opt-in and the sender's voice can carry the cheekier aside
407
409
 
408
- For sender-owned LinkedIn-post-sourced campaigns, it is acceptable to thank
409
- the recipient for showing some love/support on the sender's post when the row
410
- proves a reaction or comment. Keep it first-person, light, and non-assumptive:
411
- `appreciate you showing some love on my post about {{signal_topic}}` is
412
- acceptable; do not say `you commented` unless the row proves comment text.
410
+ Before choosing the source opener, classify source ownership:
411
+
412
+ - `sender-owned-single`: one sender/client is known, the selected source post
413
+ was authored by that same person, and the row/list proves a reaction or
414
+ comment.
415
+ - `sender-owned-ambiguous`: the source appears sender-owned but the final
416
+ sender is not known, multiple senders may be used, or the source author does
417
+ not clearly match the specific sender voice.
418
+ - `third-party`: the source post/thread/conversation was authored by someone
419
+ other than the sender/client.
420
+
421
+ For `sender-owned-single` LinkedIn-post-sourced campaigns, it is acceptable to
422
+ thank the recipient for showing some love/support on the sender's post when
423
+ the row proves a reaction or comment. Keep it first-person, light, and
424
+ non-assumptive: `appreciate you showing some love on my post about
425
+ {{signal_topic}}` is acceptable; do not say `you commented` unless the row
426
+ proves comment text. If meaningful comment text exists in the row, a comment
427
+ callout is allowed only at topic level; do not quote or paraphrase the comment
428
+ unless the row text is available and the wording materially improves the
429
+ opener.
430
+
431
+ For `sender-owned-single`, third-party thread framing is a hard failure:
432
+ do not write `found you in a thread`, `saw you in a thread`, `saw you in
433
+ conversations`, or `saw you in a few conversations` unless the source is
434
+ truly third-party. The branch-level reusable template must either use the
435
+ first-person acknowledgment plus bridge, or omit the source line.
436
+
437
+ For `sender-owned-ambiguous` or multi-sender campaigns, do not assume the
438
+ message is from a specific person. Do not write `my post`, `Grace's post`, or
439
+ any first-person post acknowledgment unless the final sender/source-owner
440
+ match is proven for that row. Omit the sender-owned source line until row
441
+ generation can safely fill it. Neutral thread/source language is only for
442
+ truly third-party sources.
443
+ In short: do not assume the message is from a specific person when the final
444
+ sender/source-owner match is ambiguous.
445
+
413
446
  Do not let the acknowledgment dead-end. Follow it with a soft post-topic to
414
447
  buyer-context bridge before broad pain or product copy. Prefer:
415
448
  `figured this might be relevant if {{channel_context}} is becoming more of a
@@ -804,6 +837,13 @@ Finalizer preference when multiple candidates are otherwise comparable:
804
837
  supports
805
838
  - if an A/B CTA adds ceremony without increasing buyer confidence, cut
806
839
  it back to one ask
840
+ - if a selected template or gold-standard influence ends with a
841
+ non-question CTA statement, do not preserve the surface wording. Preserve
842
+ the buyer promise and rewrite the CTA as one concrete yes/no question.
843
+ Example: `easiest way to see if it's worth a look is to try it with one of
844
+ your actual menus. happy to set that up or I can send a 2-min video
845
+ instead.` should become a single question that names the useful object, such
846
+ as `open to seeing what one real menu would look like in the product?`
807
847
  - do not default to founder-to-founder, MD-to-MD, doctor-to-doctor,
808
848
  peer-call, compare-notes, or similar identity-call framing. Those CTAs
809
849
  are usually weaker than naming the useful thing the buyer gets. Use them
@@ -973,7 +1013,7 @@ Message-validation artifact budget:
973
1013
 
974
1014
  **Substance-filter gate before the Finalizer Pass:** each candidate is
975
1015
  checked against the 8 Substance Filters in
976
- `../create-campaign-v2/references/thomas-revision-filters.md` (Earned-
1016
+ `../create-campaign-v2/references/sellable-cleanup-rules.md` (Earned-
977
1017
  right, Presumption, Vague-proof, Read-as-1:1, Founder-origin coherence,
978
1018
  Anti-AI-tell, Anti-talk-at, Anti-self-introduction). A candidate that
979
1019
  fails any filter is marked BLOCKED in `message-validation.md` (cite
@@ -1070,6 +1110,20 @@ Return `revise-message` with the missing strategy pieces.
1070
1110
 
1071
1111
  CTA and PS are tools, not defaults.
1072
1112
 
1113
+ The final CTA must be a question unless the user explicitly approved a
1114
+ non-question outbound motion. Template preservation does not override this. If
1115
+ the best draft or primary example has a statement CTA (`happy to set that up`,
1116
+ `I can send...`, `let me know`, `worth a look is...`), run a CTA normalization
1117
+ pass before selecting the winner:
1118
+
1119
+ - keep the useful object the buyer gets
1120
+ - cut weak second options unless both choices are independently valuable
1121
+ - make the ask one self-contained yes/no question on its own line
1122
+ - preserve the campaign's approved intent, not the exact words
1123
+ - write the question from the campaign's real object and product category; do
1124
+ not hard-code wording from a gold example when the buyer input, artifact,
1125
+ preview, or product is different
1126
+
1073
1127
  CTA options must be scored before drafting. Use `two options:` only when
1074
1128
  both choices are genuinely useful and supported:
1075
1129
 
@@ -1154,11 +1208,17 @@ message / artifact] was made with [product].`
1154
1208
  lowers "is this real?" / "will this company be around?" risk without
1155
1209
  bloating the body. Its job can be legitimacy, not direct persuasion:
1156
1210
  it answers whether the company and offer are real enough to take a look.
1157
- It must still tie the backing to the buyer segment, product boundary, or
1158
- buyer outcome instead of flashing a badge. Shapes:
1211
+ It must still tie the backing to the buyer outcome instead of flashing a
1212
+ badge or describing the seller's focus. Good shapes:
1159
1213
  `p.s. we're YC-backed and built for [specific buyer segment] trying to
1160
- [buyer outcome].` or `p.s. we're backed by [credible backer] and focused on
1161
- [specific buyer segment / problem].` Keep it short and test it against no-PS.
1214
+ [buyer outcome].` or `p.s. we're backed by [credible backers] to help
1215
+ [buyer segment] turn [buyer-owned workflow/channel] into [buyer outcome].`
1216
+ Keep it short and test it against no-PS. Do not use
1217
+ `focused on [category/problem]` in prospect-facing copy; translate company
1218
+ focus into the buyer's problem/outcome, or omit the PS. For a
1219
+ LinkedIn-content motion only, a good translation is:
1220
+ `p.s. we're backed by operators from [credible companies] to help teams
1221
+ turn LinkedIn content into dependable pipeline.`
1162
1222
 
1163
1223
  If YC, notable backing, funding, or named investor proof is present AND
1164
1224
  the buyer is in healthcare, financial services, security, enterprise, or
@@ -1280,7 +1340,7 @@ Truth is not enough. The line must do a job for the prospect.
1280
1340
 
1281
1341
  ### Single-send-unit gate (HARD INVARIANT)
1282
1342
 
1283
- Dry-mode create-campaign-v2 message generation approves the **first outbound
1343
+ Offline-validation message generation approves the **first outbound
1284
1344
  send only**. The Selected Winner must be exactly one send unit for one channel:
1285
1345
  one INVITE, one INMAIL_OPEN / INMAIL_CLOSED body plus optional subject, or one
1286
1346
  DM body when the campaign explicitly starts with DM.
@@ -1725,6 +1785,9 @@ PO from your inbox?` beats `worth 15 min to compare notes?` because the
1725
1785
  (`we're YC-backed and trying to help banks stop scam money before it
1726
1786
  moves`) or materially lower commitment (`happy to send the sample
1727
1787
  without a call first`). Prefer the buyer-outcome version when both fit.
1788
+ Do not write `backed by [X] and focused on [Y]`; "focused on" describes
1789
+ the seller. Translate it to `backed by [X] to help [buyer] [outcome]`,
1790
+ or choose no PS.
1728
1791
  For high-trust or new-category offers, YC/backing should be tested as a
1729
1792
  PS before being marked internal-only; the question is whether the PS
1730
1793
  lowers trust risk for the buyer, not whether the body already has one
@@ -2150,7 +2213,7 @@ Rules:
2150
2213
  - write the PS in a voice the reader can place:
2151
2214
  - if the **sender is the founder/operator**, write in `I` voice. Archive anchor: Superposition's `"I placed the first engineering hire at Brex."`
2152
2215
  - 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]."`
2153
- - `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."`
2216
+ - `our team` and `we` voices work well for backing, funding, or collective proof. Shape: `"Our team is backed by [investor] to help [buyer segment] [buyer outcome]."`
2154
2217
  - **default to ONE proof beat** — the single beat that most directly answers "why is this sender a fit for my specific pain?"
2155
2218
  - 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):
2156
2219
  - the buyer's likely concern is "does this actually work reliably" → a beat about technical depth or track record strengthens the fit
@@ -2164,14 +2227,15 @@ Rules:
2164
2227
  - the proof is purely credential without a relevance hook you can write in one sentence
2165
2228
  - the body already carries the mechanism and relevance and adding a PS would dilute rather than reinforce
2166
2229
  - except when the PS itself is the proof/demo that makes the core claim more believable
2167
- - examples of good shapes (abstract — to be instantiated from the brief's safe-claims list, not copied):
2230
+ - examples of good shapes (abstract — to be instantiated from the brief's safe-claims list, not copied):
2168
2231
  - `"Our CEO [ran a comparable operation before this], so the product is built for how [buyer-specific failure mode] actually breaks."`
2169
2232
  - `"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."`
2170
- - `"Our team is backed by [named investor] because they're seeing the same [buyer pain] at every [segment] we talk to."`
2233
+ - `"Our team is backed by [named investor] to help [buyer segment] [buyer outcome]."`
2171
2234
  - examples of bad shapes (automatic revisions):
2172
2235
  - `"Alex did X. Jordan did Y."` — bare first names with no anchor, no relevance to the buyer's pain
2173
2236
  - `"CEO Alex, 2x founder. CTO Jordan, ex-FAANG."` — credential list, no relevance hook
2174
2237
  - `"Our team has deep [X] and [Y] experience."` — generic, no specifics
2238
+ - `"We're backed by [investor] and focused on [category/problem]."` — company-focus copy; translate to buyer outcome or cut
2175
2239
  - any PS that could be dropped without weakening the fit case — drop it instead
2176
2240
 
2177
2241
  ### Safety
@@ -2182,7 +2246,7 @@ Rules:
2182
2246
  - reject personalization that cannot be traced to `lead-sample.json`
2183
2247
  - keep proof claims inside the brief's safe-claims boundary
2184
2248
  - use only signals validated in `lead-sample.json`
2185
- - pass the Thomas revision filters before returning
2249
+ - pass the Sellable cleanup rules before returning
2186
2250
 
2187
2251
  When token sourcing is weak:
2188
2252
 
@@ -2388,7 +2452,7 @@ hiring for`
2388
2452
 
2389
2453
  ## Token Adherence Table
2390
2454
 
2391
- | Sample | Supported Tokens Only | All Tokens Resolved | Proof Safe | Personalization Grounded | Thomas Filters | Result |
2455
+ | Sample | Supported Tokens Only | All Tokens Resolved | Proof Safe | Personalization Grounded | Sellable Cleanup Rules | Result |
2392
2456
  | ------ | --------------------- | ------------------- | ---------- | ------------------------ | -------------- | ------ |
2393
2457
 
2394
2458
  ## Message Element Plan
@@ -2607,7 +2671,7 @@ Automatic failures in dry mode:
2607
2671
  - invented proof or personalization
2608
2672
  - no compelling proof element despite the brief supporting one
2609
2673
  - a CTA that depends on missing proof
2610
- - copy that fails the Thomas revision filters
2674
+ - copy that fails the Sellable cleanup rules
2611
2675
  - any post-accept DM, follow-up, second touch, cadence branch, or sequence copy
2612
2676
  in the first-message validation artifact
2613
2677
  - any mutation tool usage
@@ -2619,7 +2683,7 @@ Automatic failures in dry mode:
2619
2683
  Goal: lock tone + offer with 1-3 examples before scaling.
2620
2684
  Only hard requirement: draft at least one message before batch; saving examples is strongly recommended but optional.
2621
2685
 
2622
- Before drafting, read any Phase 75 brief-calibration assets already present:
2686
+ Before drafting, read any brief-calibration assets already present:
2623
2687
 
2624
2688
  - the campaign brief itself
2625
2689
  - any "Messaging Calibration" section saved back into the brief
@@ -2659,27 +2723,27 @@ too generic, diagnose the gap precisely:
2659
2723
 
2660
2724
  Then tighten the brief or calibration notes before scaling.
2661
2725
 
2662
- Use the v2 runtime gold pack as the primary line-level source even when the
2663
- brief does not already contain winning examples. Do not default to generic
2664
- REPLY-style copy when the motion clearly matches a tighter approved pattern.
2665
- Primary approved references are:
2726
+ Use `gold-standard-message-examples.md` as the primary line-level source even
2727
+ when the brief does not already contain winning examples. Do not default to
2728
+ generic REPLY-style copy when the motion clearly matches a tighter approved
2729
+ pattern. Primary runtime references are:
2666
2730
 
2667
2731
  - sellable.dev
2668
- - Hey Digital / HeyDigital
2732
+ - Hey Digital
2669
2733
  - Galley
2670
2734
  - Clover
2671
2735
  - Persona
2672
2736
 
2673
2737
  Use Superpower only for benefits/healthcare mechanism language and cleaned
2674
- low-certainty relevance bridges. Use Revvix / Spektion and Superposition only
2675
- for explicit event/logistics or job-post/founder-hiring motions. Do not use
2676
- Gelee, westpark villas, Amplify Security, or raw old-client archive examples as
2677
- runtime inspiration unless the caller explicitly provides them as campaign
2678
- calibration.
2679
-
2680
- When the brief is sparse but the motion clearly matches an archived winner,
2681
- borrow the closest approved shape from `gold-standard-runtime-message-pack.md`
2682
- first, then use `gold-standard-message-examples.md` only for strategy skeletons
2738
+ low-certainty relevance bridges. Use Galley only for matching foodservice,
2739
+ event/demo, or signal-led operator motions. Use Revvix / Spektion and
2740
+ Superposition only for explicit event/logistics or job-post/founder-hiring
2741
+ motions. Do not use Gelee, westpark villas, Amplify Security, or raw old-client
2742
+ archive examples as runtime inspiration unless the caller explicitly provides
2743
+ them as campaign calibration.
2744
+
2745
+ When the brief is sparse but the motion clearly matches an approved winner,
2746
+ borrow the closest approved shape from `gold-standard-message-examples.md`
2683
2747
  before inventing a new structure.
2684
2748
 
2685
2749
  ### Single Row
@@ -0,0 +1,9 @@
1
+ {
2
+ "parallelMode": "wide",
3
+ "agentCount": 6,
4
+ "maxToolCallsPerAgent": 2,
5
+ "senderMaxAgents": 2,
6
+ "senderMaxToolCallsPerAgent": 3,
7
+ "progressMode": true,
8
+ "debugMode": true
9
+ }