@sellable/mcp 0.1.269 → 0.1.272
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/dist/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/server.js +7 -8
- package/dist/tools/content-posts.d.ts +421 -1
- package/dist/tools/content-posts.js +802 -0
- package/dist/tools/engage-discovery.d.ts +24 -0
- package/dist/tools/engage-discovery.js +114 -9
- package/dist/tools/leads.js +1 -1
- package/dist/tools/registry.d.ts +76 -47
- package/dist/tools/registry.js +0 -2
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +0 -10
- package/skills/create-campaign/core/providers/prospeo.json +2 -5
- package/skills/create-post/SKILL.md +768 -36
- package/skills/create-post/references/hook-research-playbook.md +509 -31
- package/skills/create-post/references/linkedin-preview-rendering.md +221 -0
- package/skills/create-post/references/post-file-contract.md +41 -0
- package/skills/create-post/references/post-validation.md +297 -27
- package/skills/create-post/references/premise-development.md +298 -7
- package/skills/providers/prospeo.md +0 -21
- package/skills/research/config.json +9 -0
- package/dist/tools/harvest-jobs.d.ts +0 -182
- package/dist/tools/harvest-jobs.js +0 -429
|
@@ -1,6 +1,24 @@
|
|
|
1
|
-
# Hook Research Playbook
|
|
2
|
-
|
|
3
|
-
Hook research must use current Sellable engagement data before drafting unless
|
|
1
|
+
# Hook Research Playbook V2
|
|
2
|
+
|
|
3
|
+
Hook research must use current Sellable engagement data before drafting unless
|
|
4
|
+
the user explicitly asks for `unsaved_preview`. The goal is not only to find
|
|
5
|
+
hooks. The goal is to find the weighted best posts, understand why they made
|
|
6
|
+
readers click "see more," decompose each post into a reusable narrative and
|
|
7
|
+
positioning template, and then adapt those templates to the user's real story
|
|
8
|
+
without copying source wording.
|
|
9
|
+
|
|
10
|
+
V2 research has six outputs:
|
|
11
|
+
|
|
12
|
+
1. weighted source winners: the best recent posts to learn from
|
|
13
|
+
2. hook autopsies: exact preview measurements, open loops, and tension created
|
|
14
|
+
3. source-message outlines: the paragraph/line/phrase structure of each source
|
|
15
|
+
post in its original order
|
|
16
|
+
4. viral-post outlines: the reusable narrative structure of each source post
|
|
17
|
+
5. post positioning breakdown templates: line-level positioning and narrative
|
|
18
|
+
technique maps that can be adapted into the user's draft
|
|
19
|
+
6. thought leader voice variants from the configured active influencer
|
|
20
|
+
list, unless the user explicitly skipped thought leaders or supplied a
|
|
21
|
+
named subset
|
|
4
22
|
|
|
5
23
|
## Search Inputs
|
|
6
24
|
|
|
@@ -29,11 +47,17 @@ Worker owns:
|
|
|
29
47
|
- full-text matching by URL/activity ID
|
|
30
48
|
- duplicate removal
|
|
31
49
|
- lead-magnet, giveaway, engagement-bait, and off-voice filtering
|
|
32
|
-
-
|
|
50
|
+
- audience tension extraction across kept and rejected examples
|
|
33
51
|
- premise input extraction: real scenes, observed tensions, reader value, proof gaps
|
|
34
|
-
- hook opening measurement
|
|
52
|
+
- hook opening measurement and "see more" tension autopsy
|
|
35
53
|
- exact phrase-pattern extraction
|
|
54
|
+
- post positioning breakdown by line and phrase
|
|
55
|
+
- viral-post outline extraction
|
|
56
|
+
- line-to-template conversion
|
|
36
57
|
- body-structure extraction
|
|
58
|
+
- body-expression input extraction for the later draft lab
|
|
59
|
+
- per-creator voice variant assembly when the user supplied thought
|
|
60
|
+
leaders
|
|
37
61
|
- rejected-example notes
|
|
38
62
|
- track-person and gold-standard recommendations
|
|
39
63
|
|
|
@@ -51,14 +75,20 @@ Worker output must be a compressed research packet, not a data dump:
|
|
|
51
75
|
Research packet:
|
|
52
76
|
- sources kept: max 8
|
|
53
77
|
- sources rejected: max 8
|
|
54
|
-
-
|
|
78
|
+
- audience tension snapshot: max 8 bullets
|
|
55
79
|
- controversy candidates: max 8
|
|
56
80
|
- premise inputs: max 8
|
|
57
81
|
- full adapted hook blocks: max 12
|
|
58
82
|
- exact phrase patterns: max 20
|
|
83
|
+
- post positioning breakdowns: max 8
|
|
84
|
+
- viral-post outlines: max 8
|
|
85
|
+
- reusable post templates: max 8
|
|
59
86
|
- body patterns: max 8
|
|
60
87
|
- source URLs and author profile URLs
|
|
61
88
|
- preview measurements
|
|
89
|
+
- hook-to-body promise maps
|
|
90
|
+
- body expression inputs
|
|
91
|
+
- thought leader voice variants
|
|
62
92
|
- confidence gaps
|
|
63
93
|
- save recommendations
|
|
64
94
|
```
|
|
@@ -118,23 +148,59 @@ Penalize lead-magnet and engagement-bait mechanics unless the user explicitly as
|
|
|
118
148
|
- "like and comment"
|
|
119
149
|
- broad giveaway framing that makes engagement inflate without proving the hook/body worked
|
|
120
150
|
|
|
121
|
-
##
|
|
151
|
+
## Keeper Threshold
|
|
152
|
+
|
|
153
|
+
Only promote a source post into template analysis when it clears a practical
|
|
154
|
+
keeper threshold. A post does not have to be perfect, but it must be useful
|
|
155
|
+
enough that copying its structure would teach the draft something.
|
|
156
|
+
|
|
157
|
+
Keeper fields:
|
|
122
158
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
159
|
+
```text
|
|
160
|
+
keeper_score:
|
|
161
|
+
topic_fit: 1-10
|
|
162
|
+
hook_preview_strength: 1-10
|
|
163
|
+
see_more_tension: 1-10
|
|
164
|
+
body_payoff_strength: 1-10 | full_text_unavailable
|
|
165
|
+
positioning_density: 1-10
|
|
166
|
+
creator_repeat_success: 1-10 | unknown
|
|
167
|
+
engagement_quality: 1-10
|
|
168
|
+
replicability_for_user: 1-10
|
|
169
|
+
voice_fit: 1-10
|
|
170
|
+
penalties:
|
|
171
|
+
lead_magnet:
|
|
172
|
+
engagement_bait:
|
|
173
|
+
celebrity_or_account_size_only:
|
|
174
|
+
borrowed_proof:
|
|
175
|
+
body_unavailable:
|
|
176
|
+
verdict: keeper | maybe | reject
|
|
177
|
+
why:
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Use `keeper` only when the post has enough hook and body visibility to create a
|
|
181
|
+
template. Use `maybe` when the hook is useful but the body is unavailable or the
|
|
182
|
+
post depends too much on the source creator's status. Use `reject` when the post
|
|
183
|
+
is mostly reach, giveaway mechanics, copied trend language, or poor fit.
|
|
184
|
+
|
|
185
|
+
## Audience Tension Snapshot
|
|
186
|
+
|
|
187
|
+
Before selecting a hook or writing a draft, synthesize an audience tension
|
|
188
|
+
snapshot from the kept and rejected posts. This is the step that prevents an
|
|
189
|
+
internally coherent post from becoming externally boring without forcing the
|
|
190
|
+
workflow into a large audience model.
|
|
126
191
|
|
|
127
192
|
Record:
|
|
128
193
|
|
|
129
194
|
- resonating ideas: what topics or claims are repeatedly earning real
|
|
130
195
|
engagement in the last 30-120 days
|
|
131
|
-
- implicit beliefs: what the audience seems to already believe but may not say
|
|
132
|
-
directly
|
|
133
196
|
- audience wants: what they want to feel, learn, try, buy, avoid, or be early to
|
|
134
|
-
-
|
|
197
|
+
- visible tension: the contradiction, tradeoff, cost, or unfinished question
|
|
198
|
+
readers are reacting to
|
|
199
|
+
- audience objections: what they are tired of, skeptical about, embarrassed by,
|
|
200
|
+
or likely to argue with
|
|
135
201
|
- audience fears: what risk would make them hesitate
|
|
136
202
|
- argument bait: what they will plausibly disagree with in comments
|
|
137
|
-
- credible
|
|
203
|
+
- credible angle: what the user can argue without borrowing someone else's
|
|
138
204
|
proof or pretending to have data they do not have
|
|
139
205
|
- avoid list: ideas that are inflated by comment bait, stale category claims,
|
|
140
206
|
celebrity reach, giveaway mechanics, or poor voice fit
|
|
@@ -142,11 +208,11 @@ Record:
|
|
|
142
208
|
The selected direction must include:
|
|
143
209
|
|
|
144
210
|
```text
|
|
145
|
-
Selected
|
|
211
|
+
Selected angle:
|
|
146
212
|
<one sentence>
|
|
147
213
|
|
|
148
214
|
Why this audience would engage:
|
|
149
|
-
<specific
|
|
215
|
+
<specific tension, want, objection, or fear>
|
|
150
216
|
|
|
151
217
|
Why this user can credibly say it:
|
|
152
218
|
<raw idea, memory, story, proof, or product mechanism>
|
|
@@ -155,19 +221,21 @@ What not to claim:
|
|
|
155
221
|
<unsupported metric, borrowed proof, or hype phrase to avoid>
|
|
156
222
|
```
|
|
157
223
|
|
|
158
|
-
If the raw idea is true but the
|
|
224
|
+
If the raw idea is true but the audience tension snapshot does not show a live tension,
|
|
159
225
|
do not draft from the raw idea as-is. Present stronger directions or reframe the
|
|
160
226
|
idea around the closest supported external tension.
|
|
161
227
|
|
|
162
228
|
## Premise Inputs
|
|
163
229
|
|
|
164
|
-
After the
|
|
230
|
+
After the audience tension snapshot, extract the ingredients needed for premise
|
|
165
231
|
development. Do this before hook generation.
|
|
166
232
|
|
|
167
233
|
Record:
|
|
168
234
|
|
|
169
235
|
- real story or scene candidates from the raw idea, memory, transcript, or
|
|
170
236
|
current-session context
|
|
237
|
+
- transcript worldview packet matches: clusters, transcript references, cards,
|
|
238
|
+
repeated phrasing, worldview ingredients, and hot-take ingredients
|
|
171
239
|
- observed pattern candidates when no first-person story is available
|
|
172
240
|
- visible tension: the uncomfortable gap, cost, contradiction, or tradeoff
|
|
173
241
|
- common belief: what the audience probably believes right now
|
|
@@ -175,6 +243,7 @@ Record:
|
|
|
175
243
|
- reader value: what the reader learns, sees differently, or can do
|
|
176
244
|
- proof available: what can be safely used
|
|
177
245
|
- proof missing: what cannot be claimed without user confirmation
|
|
246
|
+
- private/sensitive transcript material to exclude
|
|
178
247
|
|
|
179
248
|
If this section is weak, say so. Do not let the hook lab proceed as if a clever
|
|
180
249
|
opening can create value that the premise does not have.
|
|
@@ -198,19 +267,33 @@ Measure the visible opening for every shortlisted source post before extracting
|
|
|
198
267
|
the hook pattern. This makes the study useful for LinkedIn, not just generally
|
|
199
268
|
"good writing."
|
|
200
269
|
|
|
201
|
-
LinkedIn does not publish exact "see more" cutoff rules. Treat
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
-
|
|
210
|
-
|
|
270
|
+
LinkedIn does not publish exact "see more" cutoff rules. Treat preview fit as a
|
|
271
|
+
rendered-line problem first, not a fixed character-count rule. Current
|
|
272
|
+
third-party preview tools and 2026 creator references generally cluster around:
|
|
273
|
+
|
|
274
|
+
- mobile feed: about 2-3 visible text lines, often around 140 characters when
|
|
275
|
+
there is no media
|
|
276
|
+
- desktop feed: about 3-4 visible text lines, often around 210 characters when
|
|
277
|
+
there is no media
|
|
278
|
+
- media posts can show fewer text lines before truncation
|
|
279
|
+
- blank lines and `--` style separators consume visible preview lines
|
|
280
|
+
|
|
281
|
+
Use `references/linkedin-preview-rendering.md` as the required gate. Character
|
|
282
|
+
budgets are diagnostics only:
|
|
283
|
+
|
|
284
|
+
- `pass`: rendered mobile preview shows the pain, proof, or curiosity by the end
|
|
285
|
+
of the first 3 rendered lines, and the hook creates a specific click reason
|
|
286
|
+
- `warn`: rendered mobile preview creates useful curiosity but loses one useful
|
|
287
|
+
context word, wraps awkwardly, or spends a visible line on blank space or a
|
|
288
|
+
separator; include a compact fallback
|
|
289
|
+
- `fail`: the hook's real point appears after the rendered mobile review clamp,
|
|
290
|
+
the visible open loop is vague, blank lines consume the preview before the
|
|
291
|
+
point, or desktop fit is the only reason it looks good
|
|
211
292
|
|
|
212
293
|
Desktop preview has more room, so record it separately, but never let desktop
|
|
213
|
-
fit compensate for a mobile `fail`.
|
|
294
|
+
fit compensate for a mobile `fail`. Never say "we know" how LinkedIn will render
|
|
295
|
+
the hook unless there is an authenticated LinkedIn screenshot. Say the hook
|
|
296
|
+
`passes the renderer` and show the mobile/desktop visible blocks.
|
|
214
297
|
|
|
215
298
|
For each source, record:
|
|
216
299
|
|
|
@@ -224,10 +307,19 @@ For each source, record:
|
|
|
224
307
|
- `firstTwoContentLinesChars`
|
|
225
308
|
- `longestNonblankLineChars`
|
|
226
309
|
- `blankLineCountBeforeFold`
|
|
310
|
+
- `renderedPreview`: literal mobile and desktop visible blocks from
|
|
311
|
+
`references/linkedin-preview-rendering.md`
|
|
227
312
|
- `mobilePreviewBudget`: `pass`, `warn`, or `fail`
|
|
228
313
|
- `desktopPreviewBudget`: `pass`, `warn`, or `fail`
|
|
229
314
|
- `blankLineVisualRisk`
|
|
230
315
|
- `corePointBeforeLikelyTruncation`
|
|
316
|
+
- `seeMoreTension`: what question, contradiction, missing proof, or unfinished
|
|
317
|
+
story makes the reader want the next line
|
|
318
|
+
- `curiosityDebt`: what the hook promises the body must repay
|
|
319
|
+
- `firstScreenPayoffRisk`: whether the hook creates curiosity without enough
|
|
320
|
+
substance to repay it
|
|
321
|
+
- `readerClickReason`: the specific reason a target reader would click "see
|
|
322
|
+
more," not a generic label like "curiosity"
|
|
231
323
|
|
|
232
324
|
If only a search preview is available, do not pretend the opening is complete.
|
|
233
325
|
Record `sourceTextBasis: search_preview` and lower confidence when the hook
|
|
@@ -250,6 +342,9 @@ For each shortlisted source post, record:
|
|
|
250
342
|
- visible hook text or preview
|
|
251
343
|
- opening preview measurement fields from the section above
|
|
252
344
|
- hook mechanism
|
|
345
|
+
- hook promise: what the body is now obligated to prove, reveal, or resolve
|
|
346
|
+
- see-more tension: what makes the reader want the body
|
|
347
|
+
- curiosity debt: what must be repaid quickly after the fold
|
|
253
348
|
- exact hook language patterns: reusable words, phrase shapes, contrast forms,
|
|
254
349
|
sentence shapes, and transition moves
|
|
255
350
|
- story mechanism when the post is a story
|
|
@@ -304,6 +399,218 @@ Never reduce this section to high-level labels like "contrarian" or
|
|
|
304
399
|
"founder story." Those labels are allowed only after the exact phrase mechanics
|
|
305
400
|
are captured.
|
|
306
401
|
|
|
402
|
+
## Post Positioning Categories
|
|
403
|
+
|
|
404
|
+
For post research, use the familiar copy-breakdown categories, but apply them to
|
|
405
|
+
public narrative posts instead of landing pages or outbound emails. Assign one
|
|
406
|
+
primary category to every meaningful line or phrase, and add a secondary
|
|
407
|
+
category only when the same phrase clearly does two jobs.
|
|
408
|
+
|
|
409
|
+
Core categories:
|
|
410
|
+
|
|
411
|
+
- `Context`: setup, scene, timing, environment, or "why this is being said now"
|
|
412
|
+
- `Persona`: who the post is for or who appears in the story
|
|
413
|
+
- `Problem`: pain, friction, failure mode, risk, or gap
|
|
414
|
+
- `Alternative`: the old behavior, competitor, default advice, or common path
|
|
415
|
+
- `Belief`: the assumption, status game, worldview, or market consensus being
|
|
416
|
+
entered
|
|
417
|
+
- `Tension`: contradiction, tradeoff, discomfort, open loop, or argument bait
|
|
418
|
+
- `Proof`: numbers, named events, observed outcomes, screenshots, customers,
|
|
419
|
+
repeated experience, or hard-won authority
|
|
420
|
+
- `Mechanism`: the causal explanation for why the thing works or fails
|
|
421
|
+
- `Capability`: the new action the reader, product, or system can perform
|
|
422
|
+
- `Benefit`: positive outcome, leverage, speed, money, clarity, trust, or relief
|
|
423
|
+
- `Feature`: concrete product/workflow object that powers the mechanism
|
|
424
|
+
- `Identity`: founder confession, status shift, taste, vulnerability, or role
|
|
425
|
+
- `Offer`: CTA, invitation, ask, or proposed next step
|
|
426
|
+
- `Bridge`: transition line that moves the reader from hook to proof, from
|
|
427
|
+
proof to lesson, or from lesson to product
|
|
428
|
+
|
|
429
|
+
Do not hide useful detail behind a category label. The category says what the
|
|
430
|
+
line does; the technique notes must explain how the exact words do it.
|
|
431
|
+
|
|
432
|
+
## Post Positioning Breakdown
|
|
433
|
+
|
|
434
|
+
For every keeper post with enough text, create a line-level breakdown. This is
|
|
435
|
+
the post version of the admin copy-breakdown view: every line becomes a
|
|
436
|
+
positioning and narrative unit that can be templated.
|
|
437
|
+
|
|
438
|
+
Use this format:
|
|
439
|
+
|
|
440
|
+
```text
|
|
441
|
+
Post positioning breakdown:
|
|
442
|
+
source: <author + URL>
|
|
443
|
+
text_basis: full_text | search_preview | manual_user_source
|
|
444
|
+
overall_positioning_sequence:
|
|
445
|
+
<Category> -> <Category> -> <Category> -> ...
|
|
446
|
+
|
|
447
|
+
line_map:
|
|
448
|
+
1.
|
|
449
|
+
source_line:
|
|
450
|
+
char_count:
|
|
451
|
+
line_role:
|
|
452
|
+
primary_category:
|
|
453
|
+
secondary_category:
|
|
454
|
+
narrative_technique:
|
|
455
|
+
tension_created:
|
|
456
|
+
reader_question_opened:
|
|
457
|
+
body_promise:
|
|
458
|
+
proof_or_story_dependency:
|
|
459
|
+
why_this_exact_wording_works:
|
|
460
|
+
reusable_template_line:
|
|
461
|
+
adaptation_guard:
|
|
462
|
+
sellable_version_candidate:
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
Break long lines into phrase-level segments when one line contains multiple
|
|
466
|
+
jobs. Use short anchors or paraphrased line labels for outside source posts; do
|
|
467
|
+
not reproduce the full outside post. Never copy source wording into the draft
|
|
468
|
+
unless it is the user's own approved post.
|
|
469
|
+
|
|
470
|
+
## Source Message Outline
|
|
471
|
+
|
|
472
|
+
Before converting a source post into a reusable template, outline the source
|
|
473
|
+
message as it is. This is the branch map of the original post, not the adapted
|
|
474
|
+
draft plan.
|
|
475
|
+
|
|
476
|
+
The outline must preserve the source post's order and branch each paragraph,
|
|
477
|
+
line, or phrase into the high-level rhetorical goal it serves. If a paragraph
|
|
478
|
+
contains several jobs, split it into phrase-level branches.
|
|
479
|
+
|
|
480
|
+
Use this format:
|
|
481
|
+
|
|
482
|
+
```text
|
|
483
|
+
Source Message Outline:
|
|
484
|
+
source: <author + URL>
|
|
485
|
+
outline_basis: full_text | excerpt_only | screenshot | user_supplied_text
|
|
486
|
+
copyright_safety: use short anchors/paraphrases; do not reproduce the full source
|
|
487
|
+
|
|
488
|
+
P1. <short paragraph anchor or paraphrase>
|
|
489
|
+
goal: <what this paragraph makes the reader think/feel/wonder>
|
|
490
|
+
why_here: <why it appears at this point in the sequence>
|
|
491
|
+
branches:
|
|
492
|
+
A. <phrase/line anchor or paraphrase>
|
|
493
|
+
job: <high-level job of this phrase/line>
|
|
494
|
+
reader_effect: <what changes in the reader>
|
|
495
|
+
reusable_move: <what can be adapted without copying wording>
|
|
496
|
+
B. <phrase/line anchor or paraphrase>
|
|
497
|
+
job:
|
|
498
|
+
reader_effect:
|
|
499
|
+
reusable_move:
|
|
500
|
+
|
|
501
|
+
P2. <short paragraph anchor or paraphrase>
|
|
502
|
+
goal:
|
|
503
|
+
why_here:
|
|
504
|
+
branches:
|
|
505
|
+
A.
|
|
506
|
+
job:
|
|
507
|
+
reader_effect:
|
|
508
|
+
reusable_move:
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
Quality rules:
|
|
512
|
+
|
|
513
|
+
- Do not summarize the whole post first and then invent a cleaner outline.
|
|
514
|
+
- Do not skip ordinary body paragraphs; the point is to learn the source's real
|
|
515
|
+
sequence, including setup, repetition, proof, turns, and close.
|
|
516
|
+
- Every branch must answer: "What is this exact line/paragraph/phrase doing?"
|
|
517
|
+
- Use `P1`, `P2`, `A`, `B`, and `i` structure so the user can compare it
|
|
518
|
+
against the source post.
|
|
519
|
+
- If only an excerpt is available, label `outline_basis: excerpt_only` and do
|
|
520
|
+
not infer hidden body structure.
|
|
521
|
+
- After the source-message outline, then create the viral-post outline and
|
|
522
|
+
template. The adapted outline cannot replace the source-message outline.
|
|
523
|
+
|
|
524
|
+
## Viral-Post Outline
|
|
525
|
+
|
|
526
|
+
After the source-message outline and line-level breakdown, convert each keeper
|
|
527
|
+
into a viral-post outline. The viral-post outline is the reusable narrative
|
|
528
|
+
skeleton beneath the exact words, not a replacement for the source-message
|
|
529
|
+
outline.
|
|
530
|
+
|
|
531
|
+
Use this format:
|
|
532
|
+
|
|
533
|
+
```text
|
|
534
|
+
Viral-post outline:
|
|
535
|
+
source: <author + URL>
|
|
536
|
+
outline_name:
|
|
537
|
+
best_for:
|
|
538
|
+
not_good_for:
|
|
539
|
+
hook_job:
|
|
540
|
+
see_more_trigger:
|
|
541
|
+
body_payoff:
|
|
542
|
+
close_job:
|
|
543
|
+
|
|
544
|
+
beats:
|
|
545
|
+
1.
|
|
546
|
+
beat_name:
|
|
547
|
+
source_lines:
|
|
548
|
+
narrative_job:
|
|
549
|
+
positioning_categories:
|
|
550
|
+
reader_state_before:
|
|
551
|
+
reader_state_after:
|
|
552
|
+
tension_or_open_loop:
|
|
553
|
+
proof_needed:
|
|
554
|
+
reusable_instruction:
|
|
555
|
+
```
|
|
556
|
+
|
|
557
|
+
Examples of outline names:
|
|
558
|
+
|
|
559
|
+
- proof-first roadmap
|
|
560
|
+
- confession to operating rule
|
|
561
|
+
- enemy naming to mechanism
|
|
562
|
+
- teardown to replacement behavior
|
|
563
|
+
- status reversal to concrete lesson
|
|
564
|
+
- personal scene to category thesis
|
|
565
|
+
|
|
566
|
+
## Line-To-Template Conversion
|
|
567
|
+
|
|
568
|
+
Convert the source outline into reusable templates that preserve the narrative
|
|
569
|
+
job, not the source creator's language.
|
|
570
|
+
|
|
571
|
+
Use this format:
|
|
572
|
+
|
|
573
|
+
```text
|
|
574
|
+
Post template:
|
|
575
|
+
source:
|
|
576
|
+
template_name:
|
|
577
|
+
positioning_sequence:
|
|
578
|
+
<Category> -> <Category> -> <Category> -> ...
|
|
579
|
+
required_story_inputs:
|
|
580
|
+
- <input the user must actually have>
|
|
581
|
+
required_proof_inputs:
|
|
582
|
+
- <proof needed to make the template credible>
|
|
583
|
+
forbidden_borrowing:
|
|
584
|
+
- <source proof, joke, phrase, or status that cannot transfer>
|
|
585
|
+
|
|
586
|
+
template_lines:
|
|
587
|
+
1.
|
|
588
|
+
job:
|
|
589
|
+
line_shape:
|
|
590
|
+
allowed_moves:
|
|
591
|
+
disallowed_moves:
|
|
592
|
+
example_user_adaptation:
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
The template should be specific enough that another agent can draft from it
|
|
596
|
+
without re-reading the source post. If the template only says "use a contrarian
|
|
597
|
+
hook" or "tell a story," it failed.
|
|
598
|
+
|
|
599
|
+
## Hook-To-Body Promise Map
|
|
600
|
+
|
|
601
|
+
Every keeper hook must include a map from the preview to the body. This prevents
|
|
602
|
+
the later draft from using a strong opening that the body does not repay.
|
|
603
|
+
|
|
604
|
+
Record:
|
|
605
|
+
|
|
606
|
+
- hook promise: what the hook says or implies the reader will get
|
|
607
|
+
- curiosity debt: what the reader is waiting to learn after clicking
|
|
608
|
+
- first body beat: the first line or paragraph that repays the debt
|
|
609
|
+
- payoff speed: immediate | delayed | too slow
|
|
610
|
+
- tension carried forward: how the body keeps the hook's question alive
|
|
611
|
+
- body betrayal risk: where the body changes topic, gets generic, or overclaims
|
|
612
|
+
- adaptation instruction: how the user's draft must repay the same kind of debt
|
|
613
|
+
|
|
307
614
|
## Body Structure Extraction
|
|
308
615
|
|
|
309
616
|
For each keeper with full text available, extract the body in this format:
|
|
@@ -315,6 +622,9 @@ Body pattern:
|
|
|
315
622
|
Source:
|
|
316
623
|
<author + URL>
|
|
317
624
|
|
|
625
|
+
Positioning sequence:
|
|
626
|
+
<Context -> Proof -> Problem -> Mechanism -> Benefit ...>
|
|
627
|
+
|
|
318
628
|
Sequence:
|
|
319
629
|
1. <paragraph/job 1>
|
|
320
630
|
2. <paragraph/job 2>
|
|
@@ -328,6 +638,13 @@ Exact language moves:
|
|
|
328
638
|
Adapted body move:
|
|
329
639
|
<how this would show up in the user's post>
|
|
330
640
|
|
|
641
|
+
Body expression inputs:
|
|
642
|
+
- hook promise to repay:
|
|
643
|
+
- narrative beats to preserve:
|
|
644
|
+
- line shapes worth adapting:
|
|
645
|
+
- proof/story slots required:
|
|
646
|
+
- candidate Sellable body lines:
|
|
647
|
+
|
|
331
648
|
Replicability:
|
|
332
649
|
high | medium | low
|
|
333
650
|
```
|
|
@@ -349,6 +666,166 @@ For story posts, do not reduce the source to "strong first line" or a generic le
|
|
|
349
666
|
|
|
350
667
|
If the source story only works because of celebrity, outrage, giveaway mechanics, or an unavailable body section, mark it as low-replicability or `full_text_unavailable`.
|
|
351
668
|
|
|
669
|
+
## Template Selection For Drafting
|
|
670
|
+
|
|
671
|
+
After all keeper posts are broken down, select 1-3 source templates for the
|
|
672
|
+
user's idea. Selection is based on fit, not raw engagement.
|
|
673
|
+
|
|
674
|
+
For each selected template, record:
|
|
675
|
+
|
|
676
|
+
```text
|
|
677
|
+
Selected source template:
|
|
678
|
+
template_name:
|
|
679
|
+
source:
|
|
680
|
+
why_this_template_fits_the_user_story:
|
|
681
|
+
why_it_might_fail:
|
|
682
|
+
positioning_sequence_to_borrow:
|
|
683
|
+
hook_move_to_borrow:
|
|
684
|
+
body_outline_to_borrow:
|
|
685
|
+
line_shapes_to_test:
|
|
686
|
+
required_user_inputs:
|
|
687
|
+
required_proof:
|
|
688
|
+
do_not_copy:
|
|
689
|
+
draft_lab_instruction:
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
The draft lab instruction should tell the later premise/drafting stage exactly
|
|
693
|
+
how to use the template, for example:
|
|
694
|
+
|
|
695
|
+
```text
|
|
696
|
+
Use the source's proof-first roadmap sequence, but replace its revenue proof
|
|
697
|
+
with Christian's verified campaign-source ladder. Keep the hook's "unexpected
|
|
698
|
+
best source" tension. Do not borrow the source's dinner/community proof.
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
## Thought Leader Voice Variant Workers
|
|
702
|
+
|
|
703
|
+
Run a separate voice-variant worker per person for the configured active
|
|
704
|
+
thought-leader list by default during draft-producing create-post flows, unless
|
|
705
|
+
the user explicitly says to skip thought leaders, skip external inspiration, or
|
|
706
|
+
use only a named subset. Also do this when the user supplies a list of thought
|
|
707
|
+
leaders, creators, profile URLs, or handles. The configured source is
|
|
708
|
+
memory-backed `discovery/influencers.md`; include only rows where
|
|
709
|
+
`Include in Discovery` is not `false`, and treat each row's `Reason` as that
|
|
710
|
+
person's lane/adaptation brief. This is different from general search: the
|
|
711
|
+
source set is the person's own recent content.
|
|
712
|
+
|
|
713
|
+
This is a hard drafting dependency. General hook research, space benchmark
|
|
714
|
+
research, or a single combined "influencer takeaways" paragraph does not satisfy
|
|
715
|
+
the thought-leader step. The research artifact must record the active
|
|
716
|
+
configured list, expected active person count, actual voice variant count,
|
|
717
|
+
missing variants, weak variants, and selected synthesis ingredients. Ready
|
|
718
|
+
drafts require one voice variant per active configured person unless the user
|
|
719
|
+
explicitly opted out or supplied a smaller named subset.
|
|
720
|
+
|
|
721
|
+
Voice variants must model writing mechanics, not just a broad creator lens.
|
|
722
|
+
Each worker has to define what "in this person's voice" means for this idea:
|
|
723
|
+
target word-count band, line and paragraph rhythm, hook posture, recurring
|
|
724
|
+
phrase families, vocabulary level, proof pattern, formatting habits, close
|
|
725
|
+
style, and normal directness or humor. If multiple creator variants all become
|
|
726
|
+
the same long LinkedIn essay with different labels, mark the lab weak or failed.
|
|
727
|
+
|
|
728
|
+
Use one bounded background worker per person when the host supports background
|
|
729
|
+
agents. This is required for Codex/Claude hosts that expose background agents or
|
|
730
|
+
Task workers. If the host does not expose a worker mechanism, process the list
|
|
731
|
+
sequentially and record `workerExecutionMode: sequential_fallback` plus the
|
|
732
|
+
reason. Each worker must keep its output compact and must not return a full
|
|
733
|
+
corpus dump or long research report.
|
|
734
|
+
|
|
735
|
+
Runtime budget:
|
|
736
|
+
|
|
737
|
+
```text
|
|
738
|
+
per worker target: representative-length post + compact notes
|
|
739
|
+
post variant target: match the creator's normal length for this type of idea
|
|
740
|
+
source samples returned: max 3 URLs
|
|
741
|
+
hook options returned: max 3
|
|
742
|
+
steal/drop notes: max 5 bullets each
|
|
743
|
+
normal wall-clock: one background wave, 6-10 minutes total for 6-10 people
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
Worker steps:
|
|
747
|
+
|
|
748
|
+
1. Resolve the person's profile URL or handle from the user input, tracked
|
|
749
|
+
people, or memory. If the user asked for the configured list, resolve from
|
|
750
|
+
`discovery/influencers.md` first. If unresolved, ask for the URL/handle.
|
|
751
|
+
2. Fetch recent posts with `mcp__sellable__fetch_linkedin_posts`.
|
|
752
|
+
3. Fetch profile/follower context with `mcp__sellable__fetch_linkedin_profile`
|
|
753
|
+
when available.
|
|
754
|
+
4. Sample and score the person's recent posts internally by:
|
|
755
|
+
- topic fit to the user's current idea
|
|
756
|
+
- hook preview strength
|
|
757
|
+
- body payoff strength
|
|
758
|
+
- positioning density
|
|
759
|
+
- repeated success in the same lane
|
|
760
|
+
- engagement quality
|
|
761
|
+
- engagement per 1k followers when follower count is available
|
|
762
|
+
- adaptation fit for Christian/Sellable voice
|
|
763
|
+
- lead-magnet, giveaway, and status-only penalties
|
|
764
|
+
5. Build a `voice_model` before drafting. It must infer:
|
|
765
|
+
- target word-count band and normal variance for similar ideas
|
|
766
|
+
- paragraph and line rhythm
|
|
767
|
+
- hook posture and opening moves
|
|
768
|
+
- vocabulary and recurring phrase families
|
|
769
|
+
- formatting habits: bullets, numbering, equations, parentheticals, spacing
|
|
770
|
+
- proof style: story, metric, teardown, confession, field guide, challenge
|
|
771
|
+
- close style: command, reflection, CTA, punchline, or open loop
|
|
772
|
+
- factual boundaries that must come from Christian/Sellable
|
|
773
|
+
6. Assume and role-play the person's public LinkedIn voice for a private
|
|
774
|
+
synthesis variant. This means adopting their likely length, vocabulary,
|
|
775
|
+
hook tension, pacing, section shape, directness, humor level, proof style,
|
|
776
|
+
formatting, and editorial instincts.
|
|
777
|
+
7. Write the complete post that this creator would likely write from the user's
|
|
778
|
+
selected premise and context. Do not compress it into a short generic draft
|
|
779
|
+
or stretch a short-style creator into a generic long post.
|
|
780
|
+
8. Identify what the final synthesis should steal and what it must drop.
|
|
781
|
+
9. Keep factual claims grounded in the user's context. Do not invent user proof.
|
|
782
|
+
|
|
783
|
+
Each configured person must receive a full person-specific variant. Do not
|
|
784
|
+
summarize the group as a single "GTM influencers" research pass. The later
|
|
785
|
+
drafting stage should be able to compare how Alex, Zayd, Tas, Anthony, or any
|
|
786
|
+
other configured person would actually write the same Christian idea, then
|
|
787
|
+
combine the strongest pieces.
|
|
788
|
+
|
|
789
|
+
If a person's recent posts are weak or off-topic, still return a packet with
|
|
790
|
+
`worker_status: weak`, the reviewed post count, a weaker voice variant if
|
|
791
|
+
possible, confidence gaps, and a clear reason the person should not strongly
|
|
792
|
+
influence the final synthesis. If the profile or posts cannot be fetched because
|
|
793
|
+
of a tool failure, record `worker_status: retry_needed` and do not allow a
|
|
794
|
+
`ready` draft.
|
|
795
|
+
|
|
796
|
+
Worker output:
|
|
797
|
+
|
|
798
|
+
```text
|
|
799
|
+
Thought leader voice variant:
|
|
800
|
+
person:
|
|
801
|
+
profile_url:
|
|
802
|
+
worker_id_or_label:
|
|
803
|
+
worker_status: pass | weak | retry_needed | blocked
|
|
804
|
+
recent_posts_sampled:
|
|
805
|
+
follower_count: <number | unavailable>
|
|
806
|
+
normalization_confidence: high | medium | low
|
|
807
|
+
voice_model: [max 8 bullets covering target length, rhythm, vocabulary, formatting, proof style, close]
|
|
808
|
+
mechanics_receipt:
|
|
809
|
+
- target_word_count_band:
|
|
810
|
+
- actual_word_count:
|
|
811
|
+
- paragraph_line_rhythm:
|
|
812
|
+
- vocabulary_markers:
|
|
813
|
+
- formatting_markers:
|
|
814
|
+
- close_style:
|
|
815
|
+
- mechanics_match: pass | weak | fail
|
|
816
|
+
hook_options: [max 3]
|
|
817
|
+
post_variant: <complete post in the creator's inferred voice and representative length>
|
|
818
|
+
steal_for_final: [max 5 bullets]
|
|
819
|
+
drop_for_final: [max 5 bullets]
|
|
820
|
+
source_urls_sampled: [max 3]
|
|
821
|
+
confidence_gaps:
|
|
822
|
+
```
|
|
823
|
+
|
|
824
|
+
The worker may call the private draft "in <person>'s voice" because that is the
|
|
825
|
+
role-play job. The orchestrator must not claim the creator authored it, must not
|
|
826
|
+
copy exact outside wording into the final, and must ground final claims in
|
|
827
|
+
Christian/Sellable context.
|
|
828
|
+
|
|
352
829
|
## Blocked States
|
|
353
830
|
|
|
354
831
|
Local idea capture can still succeed when research fails.
|
|
@@ -367,8 +844,9 @@ Save the research with `mcp__sellable__save_hook_research` before drafting.
|
|
|
367
844
|
|
|
368
845
|
The saved research must contain enough detail to support a user-visible
|
|
369
846
|
`Research Learning Report`: source examples, full adapted hook blocks, exact
|
|
370
|
-
phrase patterns,
|
|
371
|
-
|
|
847
|
+
phrase patterns, post positioning breakdowns, viral-post outlines, reusable
|
|
848
|
+
post templates, hook-to-body promise maps, body structures, rejected examples,
|
|
849
|
+
tracked-person recommendations, and gold-standard recommendations.
|
|
372
850
|
|
|
373
851
|
If the user approves a creator/person as a recurring inspiration source, also
|
|
374
852
|
call `mcp__sellable__upsert_engage_tracked_person` with:
|