@sellable/mcp 0.1.212 → 0.1.213

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 (35) hide show
  1. package/README.md +7 -7
  2. package/agents/post-find-leads-message-scout.md +33 -13
  3. package/dist/engage-memory.js +0 -5
  4. package/dist/identity-memory.js +0 -4
  5. package/dist/tools/engage-memory.js +2 -2
  6. package/dist/tools/leads.js +7 -3
  7. package/dist/tools/prompts.js +3 -2
  8. package/package.json +1 -1
  9. package/skills/create-campaign/context/learnings.md +1 -1
  10. package/skills/create-campaign/references/brief-template.md +2 -2
  11. package/skills/create-campaign-brief/references/brief-template.md +2 -2
  12. package/skills/create-campaign-brief/references/draft-lifecycle.md +1 -1
  13. package/skills/create-campaign-brief/references/examples/briefs/gelee.md +2 -2
  14. package/skills/create-campaign-brief/references/examples/briefs/superpower.md +41 -28
  15. package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +12 -9
  16. package/skills/create-campaign-v2/SKILL.md +4 -0
  17. package/skills/create-campaign-v2/references/ai-tells.md +51 -16
  18. package/skills/create-campaign-v2/references/approval-gate-framing.md +1 -1
  19. package/skills/create-campaign-v2/references/gold-standard-message-examples.md +30 -16
  20. package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +36 -1
  21. package/skills/create-campaign-v2/references/gold-standard-runtime-message-pack.md +252 -0
  22. package/skills/create-campaign-v2/references/thomas-revision-filters.md +17 -7
  23. package/skills/create-campaign-v2/references/validation-criteria.md +8 -5
  24. package/skills/create-campaign-v2-validation/SKILL.md +17 -1
  25. package/skills/create-post/SKILL.md +27 -27
  26. package/skills/engage/SKILL.md +12 -12
  27. package/skills/engage/core/README.md +14 -14
  28. package/skills/find-leads/SKILL.md +1 -1
  29. package/skills/generate-messages/SKILL.md +215 -90
  30. package/skills/interview/SKILL.md +24 -24
  31. package/skills/interview/references/legacy-linkedin-interview.md +12 -12
  32. package/skills/interview/references/reference-curation.md +4 -4
  33. package/skills/interview/references/voice-capture-method.md +1 -1
  34. package/skills/load-voice/SKILL.md +21 -25
  35. package/skills/research/SKILL.md +1 -1
@@ -143,15 +143,15 @@ hard failure and revise the output before returning it.
143
143
 
144
144
  Dry mode validates message quality before campaign mint.
145
145
 
146
- Read the campaign-specific dry-mode inputs from the caller's dry-run workspace:
147
-
148
- - `.sellable/configs/core/about-me.md`
149
- - `.sellable/configs/core/my-company.md`
150
- - `.sellable/configs/core/context-modes.md`
151
- - `.sellable/configs/core/proof-ledger.md`
152
- - `.sellable/configs/core/wins-ledger.md`
153
- - `.sellable/configs/core/anti-ai-writing-style.md`
154
- - `.sellable/configs/writing/outbound.md` and legacy `styleguide-core.md` as fallback/source material when present
146
+ Read these campaign inputs:
147
+
148
+ - `~/.sellable/configs/core/about-me.md`
149
+ - `~/.sellable/configs/core/my-company.md`
150
+ - `~/.sellable/configs/core/context-modes.md`
151
+ - `~/.sellable/configs/core/proof-ledger.md`
152
+ - `~/.sellable/configs/core/wins-ledger.md`
153
+ - `~/.sellable/configs/core/anti-ai-writing-style.md`
154
+ - `~/.sellable/configs/writing/outbound.md` and legacy `styleguide-core.md` as fallback/source material when present
155
155
  - `brief.md`
156
156
  - `lead-sample.json` from the find-leads step; this is the only allowed sample
157
157
  source for dry-mode message generation
@@ -159,29 +159,66 @@ Read the campaign-specific dry-mode inputs from the caller's dry-run workspace:
159
159
  prospect setup workstreams in parallel, start the prep/candidate stages and then
160
160
  reconcile before final `message-validation.md`.
161
161
 
162
- ## Reference Asset Loading
163
-
164
- These references are packaged in `@sellable/mcp` and must be loaded through the
165
- Sellable MCP asset loader in live/customer runs. Continue each asset load with
166
- the returned `nextOffset` until `hasMore` is false.
167
-
168
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign", assetPath: "references/ai-native-tokens.md" })`
169
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign", assetPath: "references/token-fill-examples.md" })`
170
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-brief", assetPath: "references/phase75-active-runtime-message-pack.md" })`
171
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/validation-criteria.md" })`
172
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/thomas-revision-filters.md" })`
173
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-patterns.md" })`
174
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-examples.md" })`
175
- - `mcp__sellable__get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-validation-example.md" })`
162
+ ## Reference Asset Loading (do this before drafting)
163
+
164
+ Do not draft from this prompt alone. The full `generate-messages` prompt is
165
+ 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,
169
+ 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
172
+ bulk-load the conditional references unless their trigger applies or the caller
173
+ explicitly asks for maximum context over speed.
174
+
175
+ Use `mcp__sellable__get_subskill_asset` for packaged assets:
176
+
177
+ | Group | Asset to load | Job |
178
+ | --- | --- | --- |
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. |
180
+ | 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
+ | 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. |
184
+ | Dry-mode artifact output only | `subskillName: "create-campaign-v2", assetPath: "references/gold-standard-message-validation-example.md"` | Fully worked example for proof inventory, candidate messages, Finalizer Pass, Selected Winner, findings, and recommendation. |
185
+ | Dry-mode artifact output only | `subskillName: "create-campaign-v2", assetPath: "references/validation-criteria.md"` | Step-level acceptance criteria and dry-mode message validation expectations. |
186
+ | 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
+
189
+ Example packaged asset calls:
190
+
191
+ - `get_subskill_asset({ subskillName: "create-campaign", assetPath: "references/ai-native-tokens.md" })`
192
+ - `get_subskill_asset({ subskillName: "create-campaign", assetPath: "references/token-fill-examples.md" })`
193
+ - `get_subskill_asset({ subskillName: "create-campaign-brief", assetPath: "references/phase75-active-runtime-message-pack.md" })`
194
+ - `get_subskill_asset({ subskillName: "create-campaign-v2", assetPath: "references/validation-criteria.md" })`
176
195
 
177
196
  Do not satisfy the list above by searching or reading the local filesystem.
178
197
  Path-like names in this section are package asset coordinates for MCP loading.
179
198
 
199
+ Default load order:
200
+
201
+ 1. Load the 4 **Always load before drafting** assets. Do not infer their
202
+ contents from this prompt; actually call `mcp__sellable__get_subskill_asset`
203
+ for each required asset.
204
+ 2. Draft and run the internal Finalizer Pass.
205
+ 3. Run the selected winner against `ai-tells.md`. This is never optional. If the
206
+ AI-tells catalog was not loaded or any `REJECT` tell matches, do not approve,
207
+ confirm, recommend, or show the template as ready; return `revise-message`.
208
+ 4. Load `thomas-revision-filters.md` before approval, `confirmed`, or template
209
+ recommendation.
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.
213
+
180
214
  ### Rich Personalization Contract
181
215
 
182
216
  The `create-campaign` asset `references/ai-native-tokens.md` is the canonical
183
217
  spec for personalization that requires judgment. Load it before
184
218
  writing the Token Fill Rules or any reusable template notes.
219
+ When token fill wording is material, use
220
+ `mcp/sellable/skills/create-campaign/references/token-fill-examples.md` as the
221
+ conditional good/bad fill reference.
185
222
 
186
223
  - Sentence-level personalization must use AI-native bracket tokens in the
187
224
  reusable template / token plan, not old-school field substitution. Field
@@ -218,7 +255,7 @@ winner gate**.
218
255
 
219
256
  ### Retrieval & motion
220
257
 
221
- - treat `phase75-active-runtime-message-pack.md` as the **real line-level
258
+ - treat `gold-standard-runtime-message-pack.md` as the **real line-level
222
259
  gold pack** for active clients and proven live message shapes
223
260
  - retrieve against the full archived gold-standard library and pick the closest 2-4 examples for consideration
224
261
  - use the runtime pack first for concrete formatting cues that the
@@ -348,6 +385,8 @@ artifact.**
348
385
  - `saw you on {{recent_signal}}`
349
386
  - `saw you around {{recent_signal}}`
350
387
  - `saw you engaging with {{recent_signal}}`
388
+ - `saw you raise your hand for {{signal_topic}}, so figured this was worth sending`
389
+ - `figured this was worth sending`
351
390
 
352
391
  Safer shapes:
353
392
 
@@ -355,25 +394,49 @@ artifact.**
355
394
  - `saw you might be interested in {{signal_topic}}, so hope this is relevant`
356
395
  - `saw you in a few conversations around {{signal_topic}}, so hope this is relevant`
357
396
  - `saw you in a few conversations about {{signal_topic}}, so may be off, but this seemed relevant`
358
- - `may be off, but if {{workflow_signal}} is anywhere near your lane, this might be useful`
359
- - `if {{workflow_signal}} is nowhere near your lane, ignore me`
397
+ - `appreciate you showing some love on my post about {{signal_topic}}` only when the sender/client authored the source post and the row proves a reaction or comment
398
+ - `thanks for showing support on my {{signal_topic}} post` only when the sender/client authored the source post and the row proves a reaction or comment
399
+ - `figured this might be relevant if {{channel_context}} is becoming more of a {{workflow_context}} for {{company_context}}` as the bridge after a sender-owned post acknowledgment
400
+ - `may be off, but if {{workflow_signal}} is relevant to what you're working on, this might be useful`
401
+ - `if {{workflow_signal}} is not relevant to what you're working on, ignore me`
360
402
  - `figured this might matter if {{workflow_signal}} is live at {{company}}`
361
403
  - `thought of {{company}} because {{observable_signal}} points at {{problem_context}}`
362
- - `saw you raise your hand for {{signal_topic}}, so figured this was (hopefully) worth sending` only when the engagement signal is the actual source
363
- - `saw you raise your hand for {{signal_topic}} (creepy to reach out based on that, i know) - but this felt too on the nose to ignore` only when the engagement signal is the actual source and the sender's voice can carry the cheekier aside
364
-
365
- For LinkedIn-post-sourced campaigns (commenters, reactors, lead magnet
366
- replies, or scraped conversations), it is acceptable to reference the
404
+ - `found you in a thread about {{signal_topic}}, so may be off, but this seemed relevant`
405
+ - `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
+ - `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
+
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.
413
+ Do not let the acknowledgment dead-end. Follow it with a soft post-topic to
414
+ buyer-context bridge before broad pain or product copy. Prefer:
415
+ `figured this might be relevant if {{channel_context}} is becoming more of a
416
+ {{workflow_context}} for {{company_context}}`. Avoid jumping directly from
417
+ `appreciate you showing some love...` into `a lot of B2B teams...` or `most
418
+ teams...`; that transition reads stitched together instead of human.
419
+ Every following line must cash the previous line: post support -> why the
420
+ topic may matter now -> what the product/problem has to do with that topic.
421
+ If the product/problem line would read the same after deleting the source
422
+ acknowledgment and bridge, the connection is fake; rewrite or cut until the
423
+ line-to-line chain is real.
424
+ For third-party LinkedIn-post-sourced campaigns (commenters, reactors, lead
425
+ magnet replies, or scraped conversations), it is acceptable to reference the
367
426
  conversation when it explains why the note exists. Keep it topic-level, not
368
427
  activity-log-level: `saw you in a few conversations around
369
428
  {{signal_topic}}, so hope this is relevant` is acceptable; `saw you
370
429
  commented on {{post_context}}` and `your LinkedIn activity around...` are
371
- not.
430
+ not. Reserve `raise your hand` phrasing for explicit lead-magnet comments,
431
+ replies, or opt-ins. For ordinary thread discovery, use `saw you in a few
432
+ conversations around {{signal_topic}}...` or `found you in a thread about
433
+ {{signal_topic}}...`.
372
434
 
373
435
  Keep the apologetic nature, but aim it at uncertainty, not surveillance.
374
436
  Good: `saw you in a few conversations about outbound, so may be off, but
375
- this seemed relevant`, `may be off, but if outbound is anywhere near your
376
- lane...`, `if this is nowhere near your outbound workflow, ignore me`, `hope
437
+ this seemed relevant`, `may be off, but if outbound is relevant to what
438
+ you're working on...`, `if this is not relevant to your outbound workflow,
439
+ ignore me`, `hope
377
440
  this is relevant if...`. Bad: `your role at {{company}} looked close...`,
378
441
  because it asserts fit from a title and tells the buyer about themselves.
379
442
 
@@ -402,7 +465,7 @@ Selected Winner, check it against these gates:
402
465
  - **No title-fit assertion:** do not write `your [role] role at [company]
403
466
  looked close to this problem`. A title/company can be the private reason you
404
467
  selected the row, but the buyer-facing line should stay conditional:
405
- `may be off, but if [workflow] is anywhere near your lane...`.
468
+ `may be off, but if [workflow] is relevant to what you're working on...`.
406
469
  - **Swap test:** if another founder/operator could receive the line after only
407
470
  changing names and companies, cut it or make the bridge more specific.
408
471
  - **Tell-about-themselves test:** if the line merely reports a fact the buyer
@@ -421,7 +484,9 @@ Better:
421
484
  - `saw you in a few conversations around international growth, so hope this is relevant.`
422
485
  - `saw you in a few conversations around LinkedIn outreach, so hope this is relevant.`
423
486
  - `saw you in a few conversations about LinkedIn outreach, so may be off, but this seemed relevant.`
424
- - `may be off, but if outbound is anywhere near your lane, this might be useful.`
487
+ - `appreciate you showing some love on my post about GTM engineering.`
488
+ - `figured this might be relevant if LinkedIn is becoming more of a GTM channel for {{company_context}}.`
489
+ - `may be off, but if outbound is relevant to what you're working on, this might be useful.`
425
490
  - `figured this might matter if you're testing outbound by market.`
426
491
 
427
492
  ### Angle drafting & finalizer
@@ -664,18 +729,17 @@ help...` or `built for [buyer] to...`. Do not overuse generic solved-state
664
729
  solved, or fail to connect to the specific sample row. Prefer a concrete
665
730
  row-fit line, a useful artifact, or a buyer-owned current-state observation
666
731
  that the recipient can understand without reading the brief.
667
- - if 3 adjacent mechanics, objection removers, proof points, or CTA
668
- options are genuinely parallel and easier to understand as a short
669
- `-` bullet stack, use the bullet stack in the winner. Do not reserve
670
- this for cleanup. Use bullets when they make the buyer picture the offer
671
- faster on mobile. If the product has 3+ plain mechanics such as pricing
672
- control, take-rate/economics, malpractice, credentialing, billing, async
673
- chat/photo care, or setup speed, prefer a compact bullet stack over
674
- separate prose lines unless bullets would make the note feel like a
675
- landing page. For data / intelligence products, if the buyer receives 3+
676
- concrete output types (e.g. accounts, infrastructure, signals, alerts,
677
- records, reports), prefer a short bullet stack over a dense mechanism
678
- paragraph.
732
+ - run the parallel action formatting check when the winner has 3 adjacent
733
+ product actions, outputs, mechanics, or objection removers. If the lines
734
+ repeat the same subject pattern (`It drafts...` / `It adapts...` /
735
+ `It helps...`) and each line is a discrete function with no narrative proof
736
+ clause, prefer a compact `-` bullet stack because it is easier to scan on
737
+ mobile. Example:
738
+ `It helps your team:` followed by `- Draft posts...`, `- Adapt them...`,
739
+ `- Keep showing up...`. Do not force bullets when there are only 1-2
740
+ actions, one line needs narrative context, the bullets feel like a landing
741
+ page, or the paragraph version is clearly more human and still scans cleanly.
742
+ This is a formatting preference, not a message-strategy gate.
679
743
  - if one finalist already holds the best of every piece, the winner may
680
744
  equal it — name which one and on which axis it won (relevance,
681
745
  distinctiveness, proof, coherence, readability)
@@ -744,8 +808,12 @@ Finalizer preference when multiple candidates are otherwise comparable:
744
808
  peer-call, compare-notes, or similar identity-call framing. Those CTAs
745
809
  are usually weaker than naming the useful thing the buyer gets. Use them
746
810
  only when the user explicitly chose that route or the brief makes that
747
- peer-call motion the approved offer. Even then, the CTA must name the
748
- useful return artifact, preview, teardown, or working session.
811
+ peer-call motion the approved offer. Even then, preserve the intent, not the
812
+ phrase. Translate `compare notes` into a concrete CTA that names the topic,
813
+ workflow, artifact, preview, teardown, or working session. Prefer shapes like
814
+ `Open to a quick call on how {{company_or_team}} might turn LinkedIn content
815
+ into pipeline?`. Do not use `Open to compare notes?` or `Open to comparing
816
+ notes on...`.
749
817
  - when the message is selling or introducing a product, make the product
750
818
  plain before asking for time, but do not make the opener sound like a
751
819
  homepage definition. The reader should be able to answer "what is this?"
@@ -842,6 +910,9 @@ For every line in the selected winner, ask:
842
910
  - Would removing this line make the prospect less likely to reply?
843
911
  - Does this line make the reply reason clearer, more believable, or easier
844
912
  to act on?
913
+ - Does this line follow from the line before it and make the next line feel
914
+ earned? If two adjacent lines could be swapped, deleted, or joined with
915
+ `anyway`, the transition is fake. Rewrite the bridge or cut the orphan line.
845
916
  - Is this line carrying one of the core jobs: buyer gap / pain, product
846
917
  mechanism, concrete output, or CTA?
847
918
  - Does this line repeat the same nouns, proof, or mechanism already stated
@@ -955,7 +1026,10 @@ Before drafting, answer these five questions explicitly:
955
1026
  4. **What proof makes it believable?** Pick the one proof beat that
956
1027
  answers the buyer's biggest skepticism.
957
1028
  5. **What is the lowest-friction true next step?** Use only a next step
958
- supported by the inputs.
1029
+ supported by the inputs. If the campaign brief explicitly names a CTA
1030
+ motion, preserve it unless it fails truth, clarity, pressure, or safety
1031
+ gates. Improve the CTA by making the object concrete before replacing the
1032
+ motion.
959
1033
 
960
1034
  Then choose the exact element pool that angle drafts are allowed to use:
961
1035
 
@@ -1006,6 +1080,23 @@ both choices are genuinely useful and supported:
1006
1080
  Do not add option B just to mimic a gold standard. If the second option
1007
1081
  is weak, use one CTA.
1008
1082
 
1083
+ CTA precedence:
1084
+
1085
+ 1. If the campaign brief explicitly names a CTA motion, preserve the intent of
1086
+ that motion unless it is unsupported, too high-pressure, unsafe, or too vague
1087
+ to make concrete.
1088
+ 2. If preserving it, make the object specific in the same line so the buyer
1089
+ knows what they are agreeing to discuss, see, or get.
1090
+ 3. Replace it only when the brief CTA cannot pass truth, clarity, pressure, or
1091
+ safety gates.
1092
+
1093
+ Treat `compare notes` as shorthand for a peer conversation, not as buyer-facing
1094
+ copy. The phrase itself is blocked in selected winners, including `Open to
1095
+ compare notes?`, `Founder-to-founder compare notes?`, and `Open to comparing
1096
+ notes on...`. If the brief selected that intent, translate it into a concrete
1097
+ quick-call or working-session CTA, e.g. `Open to a quick call on how
1098
+ {{company_or_team}} might turn LinkedIn content into pipeline?`.
1099
+
1009
1100
  For artifact/sample offers, the CTA should usually be one self-contained
1010
1101
  yes/no question that names the concrete thing the buyer gets. Do not split
1011
1102
  the ask into a setup sentence plus a vague question.
@@ -1118,7 +1209,7 @@ a weak body. If the PS sounds like internal reasoning, delete it. Source
1118
1209
  disclaimers such as `p.s. if the source thread was just casual reading, ignore
1119
1210
  me` are BLOCKED; if the source is too weak to stand in the opener/body, omit it.
1120
1211
  A relevance-risk PS is allowed when it names uncertainty without narrating the
1121
- source: `p.s. if this is nowhere near your outbound workflow, ignore me.`
1212
+ source: `p.s. if this is not relevant to your outbound workflow, ignore me.`
1122
1213
 
1123
1214
  ### Raw proof translation test (HARD INVARIANT)
1124
1215
 
@@ -1584,6 +1675,13 @@ teardown`, `record a video`, or similar assets are BLOCKED unless the
1584
1675
  input says that exact next step exists. When unsure, ask for the
1585
1676
  lowest-friction true next step from the brief, such as sending the
1586
1677
  setup link, next step, or a short walkthrough.
1678
+ - **Brief CTA obedience:** if the brief explicitly names a CTA motion, the
1679
+ selected winner must either preserve that motion's intent with concrete
1680
+ specificity or explain why truth, clarity, pressure, or safety gates forced a
1681
+ replacement.
1682
+ If the brief uses `compare notes`, do not put that phrase in buyer-facing copy.
1683
+ Translate it into a concrete quick-call or working-session CTA that names the
1684
+ topic or workflow.
1587
1685
  - **CTA clarity:** if the product category is unfamiliar, the CTA must
1588
1686
  make the preview easy to imagine in one short phrase. Avoid vague asks
1589
1687
  like `send the setup link` unless the message has already made that
@@ -1598,8 +1696,11 @@ teardown`, `record a video`, or similar assets are BLOCKED unless the
1598
1696
  artifact / preview] you can [use/check/compare]?`.
1599
1697
  - **CTA specificity:** generic CTAs like `compare notes`, `worth a chat`,
1600
1698
  `open to a call`, or `quick walkthrough` are BLOCKED unless the same
1601
- line names the specific thing the buyer will compare, see, or get. The
1602
- next step must be easy to picture.
1699
+ line names the specific thing the buyer will discuss, see, or get. The
1700
+ next step must be easy to picture. `Open to a quick call on how
1701
+ {{company_or_team}} might turn LinkedIn content into pipeline?` passes
1702
+ because the topic is concrete; `Open to compare notes?` fails because the
1703
+ object is missing and the phrase is stale.
1603
1704
  - **Preview CTA wording:** when the CTA is a preview, prefer `open to
1604
1705
  seeing...` over `worth seeing...` unless the chosen gold motion strongly
1605
1706
  supports `worth`. `Open to seeing what this would look like for your own
@@ -1617,7 +1718,7 @@ PO from your inbox?` beats `worth 15 min to compare notes?` because the
1617
1718
  was just casual reading, ignore me`, `only reaching out where the role and
1618
1719
  topic looked close`, or similar sourcing-defense copy.
1619
1720
  Relevance-risk opt-outs are allowed when they do not defend the source:
1620
- `p.s. if this is nowhere near your outbound workflow, ignore me.`
1721
+ `p.s. if this is not relevant to your outbound workflow, ignore me.`
1621
1722
  - **YC / backing PS:** a PS that only says `we're YC`, `we're YC W26`,
1622
1723
  `backed by YC`, or similar is BLOCKED as badge-flashing. If YC/backing
1623
1724
  is used, the same sentence must either tie to the buyer segment/outcome
@@ -1688,8 +1789,11 @@ led to it. Acceptable openers:
1688
1789
  - `Hey {{first_name}}, hope this is relevant if [buyer context] is still on your plate.`
1689
1790
  - `Hey {{first_name}}, saw you might be interested in [topic], so hope this is relevant.`
1690
1791
  - `Hey {{first_name}}, saw you in a few conversations around [topic], so hope this is relevant.`
1691
- - `Hey {{first_name}}, saw you raise your hand for [topic], so figured this was (hopefully) worth sending.`
1692
- - `Hey {{first_name}}, saw you raise your hand for [topic] (creepy to reach out based on that, i know) - but this felt too on the nose to ignore.`
1792
+ - `Hey {{first_name}}, found you in a thread about [topic], so may be off, but this seemed relevant.`
1793
+ - `Hey {{first_name}}, saw you raise your hand for [topic], so figured this was (hopefully) worth sending.` Only use this for explicit lead-magnet comments, replies, or opt-ins.
1794
+ - `Hey {{first_name}}, saw you raise your hand for [topic] (creepy to reach out based on that, i know) - but this felt too on the nose to ignore.` Only use this for explicit lead-magnet comments, replies, or opt-ins.
1795
+ - Do not use the flattened line `so figured this was worth sending`; either keep
1796
+ `(hopefully)` or use `so hope this is relevant`.
1693
1797
  - `Hey {{first_name}}, pre-[product], we [did the operator-reality
1694
1798
  thing] for [X] years; [one-line consequence].`
1695
1799
  - `Hey {{first_name}}, building a thing for [segment] I think you'd
@@ -1900,10 +2004,18 @@ Flow skeleton (apply even when motion varies):
1900
2004
  2. Pain — what's breaking now
1901
2005
  3. **What the product IS** — one crisp sentence naming the product and what category of work it takes on. Example shape: `[Product] is [a category-noun] that [takes a specific class of work off the buyer's plate]`. When the offer is for the buyer's exact role/credential, prefer `lets you...` or `[role]s like you...` over `lets a [role]...` so the buyer does not feel treated like an outsider. Archive-anchored illustrations: Galley's "AI that reads the messiest BEOs and turns them into production-ready plans"; Revvix's "shows what's actually exploitable on your endpoints based on runtime activity".
1902
2006
  4. **What the product DOES** — one action per line. Three actions maximum. Choose the rendering by a **concrete test**, not a feeling:
1903
- - **Use bullets when the action lines are maximally parallel**: each starts with the same subject (e.g. `It X` / `It Y` / `It Z`), each is a discrete product function, none carries narrative context. This is the default case.
1904
- - Example shape: `- [Verb] [concrete object from the buyer's workflow].`
1905
- - **Use one-line paragraphs only when at least one action carries a short narrative clause** that wouldn't fit cleanly in a bullet.
1906
- - "Conversational motion" is **not** a reason to prefer paragraphs. If the three actions all start with `It X`, they are parallel by definition and should render as bullets.
2007
+ - **Prefer bullets when 3 adjacent action lines are maximally parallel**:
2008
+ each starts with the same subject pattern (e.g. `It drafts...` /
2009
+ `It adapts...` / `It helps...`), each is a discrete product function,
2010
+ and none carries narrative context or proof. Use a setup line plus short
2011
+ `-` bullets, e.g. `It helps your team:` then `- Draft posts...`,
2012
+ `- Adapt them...`, `- Keep showing up...`.
2013
+ - **Use one-line paragraphs** when there are only 1-2 actions, at least one
2014
+ action carries a short narrative clause, bullets would feel like a landing
2015
+ page, or the paragraph version is clearly more human and still scans
2016
+ cleanly.
2017
+ - "Conversational motion" alone is **not** a reason to avoid bullets when
2018
+ all 3 action lines repeat the same `It X` structure.
1907
2019
  - Never stack the three actions into one glued comma-list sentence.
1908
2020
  5. Deployment ease — one short paragraph
1909
2021
  6. CTA — useful next step, binary when the brief supports it
@@ -1912,7 +2024,9 @@ Flow skeleton (apply even when motion varies):
1912
2024
  Rules within the flow:
1913
2025
 
1914
2026
  - **banned**: comma-stacking three actions into one glued sentence (e.g. `"order intake, inventory sync, and reorder timing"` glued together). Split into one action per line.
1915
- - **preferred**: one action per line — as one-line paragraphs or as a bullet list, whichever reads cleaner (see below)
2027
+ - **preferred**: one action per line — as one-line paragraphs or as a bullet
2028
+ list, whichever reads cleaner. Use bullets as a mobile readability preference
2029
+ for 3 repeated-subject product actions, not as a blanket hard gate.
1916
2030
  - the "what the product IS" sentence comes **before** the action breakdown — skipping it makes the actions feel disconnected
1917
2031
  - if the brief does not support three distinct actions, drop to two or one. Do not pad.
1918
2032
  - if a proof sentence gets long, split the metric and the explanation into separate one-line paragraphs rather than chaining them together
@@ -1930,10 +2044,11 @@ Rules:
1930
2044
  - `"Saw you might be interested in [topic], so hope this is relevant."`
1931
2045
  - `"Saw you in a few conversations around [topic], so hope this is relevant."`
1932
2046
  - `"Saw you in a few conversations about [topic], so may be off, but this seemed relevant."`
2047
+ - `"Found you in a thread about [topic], so may be off, but this seemed relevant."`
1933
2048
  - `"Thought of {{company}} because [observable signal] points at [problem]."`
1934
2049
  - `"Figured this might matter if [workflow] is live at {{company}}."`
1935
- - `"Saw you raise your hand for [topic], so figured this was (hopefully) worth sending."`
1936
- - `"Saw you raise your hand for [topic] (creepy to reach out based on that, i know) - but this felt too on the nose to ignore."`
2050
+ - `"Saw you raise your hand for [topic], so figured this was (hopefully) worth sending."` Only for explicit lead-magnet comments, replies, or opt-ins.
2051
+ - `"Saw you raise your hand for [topic] (creepy to reach out based on that, i know) - but this felt too on the nose to ignore."` Only for explicit lead-magnet comments, replies, or opt-ins.
1937
2052
  - blocked signal use:
1938
2053
  - `"AI-GTM stack is clearly on your mind."`
1939
2054
  - `"You're clearly focused on [area]."`
@@ -1942,7 +2057,9 @@ Rules:
1942
2057
  - `"Saw you on [topic]."`
1943
2058
  - `"Saw you around [topic]."`
1944
2059
  - `"Saw you engaging with [topic]."`
1945
- - signal-led opener shape is a **special case**, not the default. Use it only when the archived motion truly depends on it and the line can stay natural. For LinkedIn-post-sourced campaigns, prefer `"saw you in a few conversations around [topic], so hope this is relevant"` when referencing the source makes the outreach feel less random. Avoid activity-log phrasing such as `"you commented on..."`, `"you reacted to..."`, or `"your LinkedIn activity..."` unless the approved motion is the deliberately self-aware raise-hand line.
2060
+ - `"Saw you raise your hand for [topic], so figured this was worth sending."`
2061
+ - `"Figured this was worth sending."`
2062
+ - signal-led opener shape is a **special case**, not the default. Use it only when the archived motion truly depends on it and the line can stay natural. For LinkedIn-post-sourced campaigns, prefer `"saw you in a few conversations around [topic], so hope this is relevant"` or `"found you in a thread about [topic], so may be off, but this seemed relevant"` when referencing the source makes the outreach feel less random. Avoid activity-log phrasing such as `"you commented on..."`, `"you reacted to..."`, or `"your LinkedIn activity..."` unless the approved motion is the deliberately self-aware raise-hand line for an explicit lead-magnet comment, reply, or opt-in.
1946
2063
  - tokenized engagement-source opener shape is BLOCKED by default:
1947
2064
  `{{first_name}}, saw you {{engagement_context}} on {{post_context}}` reads
1948
2065
  like surveillance unless the filled line is explicitly self-aware and
@@ -1950,11 +2067,12 @@ Rules:
1950
2067
  [topic] is part of the plan`, `saw you might be interested in [topic], so hope
1951
2068
  this is relevant`, `saw you in a few conversations around [topic], so hope this
1952
2069
  is relevant`, `saw you in a few conversations about [topic], so may be off,
1953
- but this seemed relevant`, or one of the self-aware raise-hand shapes when the source is the
1954
- actual reason for the note: `saw you raise your hand for [topic], so figured
1955
- this was (hopefully) worth sending` or `saw you raise your hand for [topic]
1956
- (creepy to reach out based on that, i know) - but this felt too on the nose to
1957
- ignore`. Do not use the longer `you might not remember the thread...` shape;
2070
+ but this seemed relevant`, or `found you in a thread about [topic], so may be
2071
+ off, but this seemed relevant`. Use the self-aware raise-hand shapes only when
2072
+ the source was an explicit lead-magnet comment, reply, or opt-in: `saw you raise
2073
+ your hand for [topic], so figured this was (hopefully) worth sending` or `saw you
2074
+ raise your hand for [topic] (creepy to reach out based on that, i know) - but
2075
+ this felt too on the nose to ignore`. Do not use the longer `you might not remember the thread...` shape;
1958
2076
  if the concise source bridge still feels awkward, omit the engagement reference.
1959
2077
  - do not describe the sender/client in third person inside the outbound message.
1960
2078
  `p.s. Saju's angle is...`, `Christian's angle is...`, `[sender]'s approach
@@ -2016,8 +2134,8 @@ A PS must not explain strategy, defend the pitch, narrate the source thread,
2016
2134
  add a second unrelated offer, or say the quiet part out loud. Lines like `this
2017
2135
  is not just a platform idea` and `if the source thread was just casual reading,
2018
2136
  ignore me` are blocked because they sound like internal rationale. A plain
2019
- relevance-risk opt-out such as `if this is nowhere near your outbound workflow,
2020
- ignore me` can stay when it lowers pressure without explaining the scrape.
2137
+ relevance-risk opt-out such as `if this is not relevant to your outbound
2138
+ workflow, ignore me` can stay when it lowers pressure without explaining the scrape.
2021
2139
 
2022
2140
  The reader does not know who the sender's colleagues are. Dropping a bare first name with no anchor reads like a resume dump that was cut in half.
2023
2141
 
@@ -2388,7 +2506,7 @@ hiring for`
2388
2506
  - Best CTA: Candidate [A|B|C] — reason
2389
2507
  - Best PS / no-PS decision: Candidate [A|B|C] — reason
2390
2508
  - Element edits made by finalizer: ...
2391
- - Bullet-stack decision: used | rejected | not applicable — reason
2509
+ - Parallel action formatting: bullets used | paragraphs kept | not applicable — reason
2392
2510
  - Style consistency check: PASS | BLOCKED — reason
2393
2511
  - Assembly note: clean combination or one candidate swept
2394
2512
 
@@ -2397,7 +2515,7 @@ hiring for`
2397
2515
  - Original winner: ...
2398
2516
  - Simplified candidate: ...
2399
2517
  - Simplifier edits: combined lines | split dense line | preserved bullet stack | added bullet stack | none
2400
- - Bullet-stack decision: preserved | added | rejected | not applicable — reason
2518
+ - Parallel action formatting: preserved bullets | added bullets | paragraphs kept | not applicable — reason
2401
2519
  - Robustness check: PASS | BLOCKED — reason
2402
2520
  - Decision: applied | rejected
2403
2521
 
@@ -2420,6 +2538,7 @@ hiring for`
2420
2538
  - Jargon / acronym exactness: PASS | BLOCKED — reason
2421
2539
  - Style consistency: PASS | BLOCKED — reason
2422
2540
  - CTA truth: PASS | BLOCKED — reason
2541
+ - Brief CTA obedience: PASS | BLOCKED | NOT APPLICABLE — reason
2423
2542
  - CTA clarity: PASS | BLOCKED — reason
2424
2543
  - PS restraint: PASS | BLOCKED | OMITTED — reason
2425
2544
  - YC / backing PS: PASS | BLOCKED | OMITTED — reason
@@ -2540,22 +2659,28 @@ too generic, diagnose the gap precisely:
2540
2659
 
2541
2660
  Then tighten the brief or calibration notes before scaling.
2542
2661
 
2543
- Use the example bank as the primary strategy source even when the brief does
2544
- not already contain winning examples. Do not default to generic REPLY-style
2545
- copy when the motion clearly matches a tighter archived pattern. Strong
2546
- references include:
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:
2547
2666
 
2548
- - Sellable.dev
2667
+ - sellable.dev
2668
+ - Hey Digital / HeyDigital
2549
2669
  - Galley
2550
- - Gelee
2551
- - HeyDigital
2552
- - Revvix / Spektion
2553
- - Superposition
2554
- - Persona Digital
2670
+ - Clover
2671
+ - Persona
2672
+
2673
+ 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.
2555
2679
 
2556
2680
  When the brief is sparse but the motion clearly matches an archived winner,
2557
- borrow the closest message shape from
2558
- `gold-standard-message-examples.md` before inventing a new structure.
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
2683
+ before inventing a new structure.
2559
2684
 
2560
2685
  ### Single Row
2561
2686
 
@@ -2639,12 +2764,12 @@ research → condense → 10 angle agents in parallel → finalizer combines bes
2639
2764
  - Background: {1-2 lines}
2640
2765
 
2641
2766
  ## Voice + Outbound Rules (condensed — full files available via Read tool)
2642
- - Use `.sellable/configs/core/context-modes.md` to choose the right context stance, then run an anti-AI audit against `.sellable/configs/core/anti-ai-writing-style.md` before returning copy.
2643
- - Flow skeleton: opener → pain → **what the product IS** → **what it DOES** (one action per line, up to three) → deployment ease → CTA → optional PS
2767
+ - Use `~/.sellable/configs/core/context-modes.md` to choose the right context stance, then run an anti-AI audit against `~/.sellable/configs/core/anti-ai-writing-style.md` before returning copy.
2768
+ - Flow skeleton: opener → pain → **what the product IS** → **what it DOES** (one action per line, up to three; prefer short bullets for 3 repeated-subject product actions) → deployment ease → CTA → optional PS
2644
2769
  - A cold reader must be able to state what the product does in one sentence after reading. Require a crisp `Product is an X that does Y` anchor before any action breakdown. Do not gesture at "that chain" / "the stack" / "that work"
2645
2770
  - Blank line between every sentence in the body. The body renders as a sequence of one-line paragraphs separated by blank lines, not as multi-sentence paragraphs. Target 6-10 one-line paragraphs
2646
2771
  - 5th-grade reading level by default. Cut glue language (handoff, order-to-cash, rip-and-replace). Keep brief-native product/tool names (Shopify, HubSpot)
2647
- - No bullet points, no "I noticed...", no compliment sandwiches, no em dashes unless the canonical example uses one
2772
+ - No feature/benefit marketing bullet lists, no "I noticed...", no compliment sandwiches, no em dashes unless the canonical example uses one. Exception: use a short bullet stack when 3 adjacent product actions repeat the same subject pattern and bullets improve mobile readability.
2648
2773
  - No synthesized framing ("at your stage", "in a setup like yours", "running X means...", "X means you're likely...")
2649
2774
  - 3 candidates then `Finalizer Pass` — pick best opener, proof sentence, bridge, CTA across them and assemble the winner
2650
2775
  - PS is optional; only include if it materially strengthens the fit case. When included, use `I` / `our CEO` / `our team` / `we` voice, never bare first names. At most two proof beats, tied to why the sender understands the buyer's pain. No three-credential resume lists
@@ -2706,7 +2831,7 @@ research → condense → 10 angle agents in parallel → finalizer combines bes
2706
2831
  8. Return: { success: true, message: "...", research: [...], anglesExplored: 10 }
2707
2832
  ```
2708
2833
 
2709
- **IMPORTANT:** Load `.sellable/configs/core/about-me.md`, `.sellable/configs/core/my-company.md`, `.sellable/configs/core/context-modes.md`, `.sellable/configs/core/proof-ledger.md`, `.sellable/configs/core/wins-ledger.md`, `.sellable/configs/core/anti-ai-writing-style.md`, `.sellable/configs/writing/outbound.md`, and `.sellable/insights/cross-skill.md` once in the lead agent. Use the legacy style guide fallback when present. Pass condensed versions to workers so context stays focused.
2834
+ **IMPORTANT:** Load `~/.sellable/configs/core/about-me.md`, `~/.sellable/configs/core/my-company.md`, `~/.sellable/configs/core/context-modes.md`, `~/.sellable/configs/core/proof-ledger.md`, `~/.sellable/configs/core/wins-ledger.md`, `~/.sellable/configs/core/anti-ai-writing-style.md`, `~/.sellable/configs/writing/outbound.md`, and `~/.sellable/insights/cross-skill.md` once in the lead agent. Use the legacy style guide fallback when present. Pass condensed versions to workers so context stays focused.
2710
2835
 
2711
2836
  ## Batch Approval
2712
2837