@sellable/mcp 0.1.268 → 0.1.269
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 +8 -7
- package/dist/tools/content-posts.d.ts +1 -421
- package/dist/tools/content-posts.js +0 -802
- package/dist/tools/engage-discovery.d.ts +0 -24
- package/dist/tools/engage-discovery.js +9 -114
- package/dist/tools/harvest-jobs.d.ts +182 -0
- package/dist/tools/harvest-jobs.js +429 -0
- package/dist/tools/leads.js +1 -1
- package/dist/tools/registry.d.ts +47 -76
- package/dist/tools/registry.js +2 -0
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +10 -0
- package/skills/create-campaign/core/providers/prospeo.json +5 -2
- package/skills/create-post/SKILL.md +36 -622
- package/skills/create-post/references/hook-research-playbook.md +31 -464
- package/skills/create-post/references/post-file-contract.md +0 -36
- package/skills/create-post/references/post-validation.md +27 -260
- package/skills/create-post/references/premise-development.md +7 -298
- package/skills/providers/prospeo.md +21 -0
- package/skills/create-post/references/linkedin-preview-rendering.md +0 -221
- package/skills/research/config.json +0 -9
|
@@ -1,24 +1,6 @@
|
|
|
1
|
-
# Hook Research Playbook
|
|
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 five 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 inspiration packets from the configured active influencer
|
|
20
|
-
list, unless the user explicitly skipped thought leaders or supplied a
|
|
21
|
-
named subset
|
|
1
|
+
# Hook Research Playbook
|
|
2
|
+
|
|
3
|
+
Hook research must use current Sellable engagement data before drafting unless the user explicitly asks for `unsaved_preview`. The goal is not only to find hooks. The goal is to find what the market is currently rewarding, what the audience implicitly believes/wants/resents/fears, which controversial angle the user can credibly test, and what premise would deliver real reader value.
|
|
22
4
|
|
|
23
5
|
## Search Inputs
|
|
24
6
|
|
|
@@ -47,17 +29,11 @@ Worker owns:
|
|
|
47
29
|
- full-text matching by URL/activity ID
|
|
48
30
|
- duplicate removal
|
|
49
31
|
- lead-magnet, giveaway, engagement-bait, and off-voice filtering
|
|
50
|
-
-
|
|
32
|
+
- market belief mapping across kept and rejected examples
|
|
51
33
|
- premise input extraction: real scenes, observed tensions, reader value, proof gaps
|
|
52
|
-
- hook opening measurement
|
|
34
|
+
- hook opening measurement
|
|
53
35
|
- exact phrase-pattern extraction
|
|
54
|
-
- post positioning breakdown by line and phrase
|
|
55
|
-
- viral-post outline extraction
|
|
56
|
-
- line-to-template conversion
|
|
57
36
|
- body-structure extraction
|
|
58
|
-
- body-expression input extraction for the later draft lab
|
|
59
|
-
- per-creator inspiration packet assembly when the user supplied thought
|
|
60
|
-
leaders
|
|
61
37
|
- rejected-example notes
|
|
62
38
|
- track-person and gold-standard recommendations
|
|
63
39
|
|
|
@@ -75,20 +51,14 @@ Worker output must be a compressed research packet, not a data dump:
|
|
|
75
51
|
Research packet:
|
|
76
52
|
- sources kept: max 8
|
|
77
53
|
- sources rejected: max 8
|
|
78
|
-
-
|
|
54
|
+
- market belief map: max 8 bullets
|
|
79
55
|
- controversy candidates: max 8
|
|
80
56
|
- premise inputs: max 8
|
|
81
57
|
- full adapted hook blocks: max 12
|
|
82
58
|
- exact phrase patterns: max 20
|
|
83
|
-
- post positioning breakdowns: max 8
|
|
84
|
-
- viral-post outlines: max 8
|
|
85
|
-
- reusable post templates: max 8
|
|
86
59
|
- body patterns: max 8
|
|
87
60
|
- source URLs and author profile URLs
|
|
88
61
|
- preview measurements
|
|
89
|
-
- hook-to-body promise maps
|
|
90
|
-
- body expression inputs
|
|
91
|
-
- thought leader inspiration packets
|
|
92
62
|
- confidence gaps
|
|
93
63
|
- save recommendations
|
|
94
64
|
```
|
|
@@ -148,59 +118,23 @@ Penalize lead-magnet and engagement-bait mechanics unless the user explicitly as
|
|
|
148
118
|
- "like and comment"
|
|
149
119
|
- broad giveaway framing that makes engagement inflate without proving the hook/body worked
|
|
150
120
|
|
|
151
|
-
##
|
|
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:
|
|
121
|
+
## Market Belief Map
|
|
158
122
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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.
|
|
123
|
+
Before selecting a hook or writing a draft, synthesize a market belief map from
|
|
124
|
+
the kept and rejected posts. This is the step that prevents an internally
|
|
125
|
+
coherent post from becoming externally boring.
|
|
191
126
|
|
|
192
127
|
Record:
|
|
193
128
|
|
|
194
129
|
- resonating ideas: what topics or claims are repeatedly earning real
|
|
195
130
|
engagement in the last 30-120 days
|
|
131
|
+
- implicit beliefs: what the audience seems to already believe but may not say
|
|
132
|
+
directly
|
|
196
133
|
- audience wants: what they want to feel, learn, try, buy, avoid, or be early to
|
|
197
|
-
-
|
|
198
|
-
readers are reacting to
|
|
199
|
-
- audience objections: what they are tired of, skeptical about, embarrassed by,
|
|
200
|
-
or likely to argue with
|
|
134
|
+
- audience resentments: what they are tired of, embarrassed by, or angry about
|
|
201
135
|
- audience fears: what risk would make them hesitate
|
|
202
136
|
- argument bait: what they will plausibly disagree with in comments
|
|
203
|
-
- credible
|
|
137
|
+
- credible controversy: what the user can argue without borrowing someone else's
|
|
204
138
|
proof or pretending to have data they do not have
|
|
205
139
|
- avoid list: ideas that are inflated by comment bait, stale category claims,
|
|
206
140
|
celebrity reach, giveaway mechanics, or poor voice fit
|
|
@@ -208,11 +142,11 @@ Record:
|
|
|
208
142
|
The selected direction must include:
|
|
209
143
|
|
|
210
144
|
```text
|
|
211
|
-
Selected
|
|
145
|
+
Selected controversy:
|
|
212
146
|
<one sentence>
|
|
213
147
|
|
|
214
148
|
Why this audience would engage:
|
|
215
|
-
<specific
|
|
149
|
+
<specific belief/want/resentment/fear>
|
|
216
150
|
|
|
217
151
|
Why this user can credibly say it:
|
|
218
152
|
<raw idea, memory, story, proof, or product mechanism>
|
|
@@ -221,21 +155,19 @@ What not to claim:
|
|
|
221
155
|
<unsupported metric, borrowed proof, or hype phrase to avoid>
|
|
222
156
|
```
|
|
223
157
|
|
|
224
|
-
If the raw idea is true but the
|
|
158
|
+
If the raw idea is true but the market belief map does not show a live tension,
|
|
225
159
|
do not draft from the raw idea as-is. Present stronger directions or reframe the
|
|
226
160
|
idea around the closest supported external tension.
|
|
227
161
|
|
|
228
162
|
## Premise Inputs
|
|
229
163
|
|
|
230
|
-
After the
|
|
164
|
+
After the market belief map, extract the ingredients needed for premise
|
|
231
165
|
development. Do this before hook generation.
|
|
232
166
|
|
|
233
167
|
Record:
|
|
234
168
|
|
|
235
169
|
- real story or scene candidates from the raw idea, memory, transcript, or
|
|
236
170
|
current-session context
|
|
237
|
-
- transcript worldview packet matches: clusters, transcript references, cards,
|
|
238
|
-
repeated phrasing, worldview ingredients, and hot-take ingredients
|
|
239
171
|
- observed pattern candidates when no first-person story is available
|
|
240
172
|
- visible tension: the uncomfortable gap, cost, contradiction, or tradeoff
|
|
241
173
|
- common belief: what the audience probably believes right now
|
|
@@ -243,7 +175,6 @@ Record:
|
|
|
243
175
|
- reader value: what the reader learns, sees differently, or can do
|
|
244
176
|
- proof available: what can be safely used
|
|
245
177
|
- proof missing: what cannot be claimed without user confirmation
|
|
246
|
-
- private/sensitive transcript material to exclude
|
|
247
178
|
|
|
248
179
|
If this section is weak, say so. Do not let the hook lab proceed as if a clever
|
|
249
180
|
opening can create value that the premise does not have.
|
|
@@ -267,33 +198,19 @@ Measure the visible opening for every shortlisted source post before extracting
|
|
|
267
198
|
the hook pattern. This makes the study useful for LinkedIn, not just generally
|
|
268
199
|
"good writing."
|
|
269
200
|
|
|
270
|
-
LinkedIn does not publish exact "see more" cutoff rules. Treat
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
-
|
|
277
|
-
|
|
278
|
-
-
|
|
279
|
-
|
|
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
|
|
201
|
+
LinkedIn does not publish exact "see more" cutoff rules. Treat these as
|
|
202
|
+
conservative v1 planning budgets:
|
|
203
|
+
|
|
204
|
+
- `pass`: opening hook is <= 110 chars including newlines, every nonblank line
|
|
205
|
+
is <= 45 chars, and the hook's core point lands before likely truncation.
|
|
206
|
+
- `warn`: opening hook is 111-140 chars including newlines, any nonblank line is
|
|
207
|
+
46-55 chars, or blank lines create visual-line risk. Blank lines are allowed,
|
|
208
|
+
but they count as physical lines.
|
|
209
|
+
- `fail`: opening hook is > 140 chars including newlines, any nonblank line is
|
|
210
|
+
> 55 chars, or the hook's core point depends on text after likely truncation.
|
|
292
211
|
|
|
293
212
|
Desktop preview has more room, so record it separately, but never let desktop
|
|
294
|
-
fit compensate for a mobile `fail`.
|
|
295
|
-
the hook unless there is an authenticated LinkedIn screenshot. Say the hook
|
|
296
|
-
`passes the renderer` and show the mobile/desktop visible blocks.
|
|
213
|
+
fit compensate for a mobile `fail`.
|
|
297
214
|
|
|
298
215
|
For each source, record:
|
|
299
216
|
|
|
@@ -307,19 +224,10 @@ For each source, record:
|
|
|
307
224
|
- `firstTwoContentLinesChars`
|
|
308
225
|
- `longestNonblankLineChars`
|
|
309
226
|
- `blankLineCountBeforeFold`
|
|
310
|
-
- `renderedPreview`: literal mobile and desktop visible blocks from
|
|
311
|
-
`references/linkedin-preview-rendering.md`
|
|
312
227
|
- `mobilePreviewBudget`: `pass`, `warn`, or `fail`
|
|
313
228
|
- `desktopPreviewBudget`: `pass`, `warn`, or `fail`
|
|
314
229
|
- `blankLineVisualRisk`
|
|
315
230
|
- `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"
|
|
323
231
|
|
|
324
232
|
If only a search preview is available, do not pretend the opening is complete.
|
|
325
233
|
Record `sourceTextBasis: search_preview` and lower confidence when the hook
|
|
@@ -342,9 +250,6 @@ For each shortlisted source post, record:
|
|
|
342
250
|
- visible hook text or preview
|
|
343
251
|
- opening preview measurement fields from the section above
|
|
344
252
|
- 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
|
|
348
253
|
- exact hook language patterns: reusable words, phrase shapes, contrast forms,
|
|
349
254
|
sentence shapes, and transition moves
|
|
350
255
|
- story mechanism when the post is a story
|
|
@@ -399,218 +304,6 @@ Never reduce this section to high-level labels like "contrarian" or
|
|
|
399
304
|
"founder story." Those labels are allowed only after the exact phrase mechanics
|
|
400
305
|
are captured.
|
|
401
306
|
|
|
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
|
-
|
|
614
307
|
## Body Structure Extraction
|
|
615
308
|
|
|
616
309
|
For each keeper with full text available, extract the body in this format:
|
|
@@ -622,9 +315,6 @@ Body pattern:
|
|
|
622
315
|
Source:
|
|
623
316
|
<author + URL>
|
|
624
317
|
|
|
625
|
-
Positioning sequence:
|
|
626
|
-
<Context -> Proof -> Problem -> Mechanism -> Benefit ...>
|
|
627
|
-
|
|
628
318
|
Sequence:
|
|
629
319
|
1. <paragraph/job 1>
|
|
630
320
|
2. <paragraph/job 2>
|
|
@@ -638,13 +328,6 @@ Exact language moves:
|
|
|
638
328
|
Adapted body move:
|
|
639
329
|
<how this would show up in the user's post>
|
|
640
330
|
|
|
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
|
-
|
|
648
331
|
Replicability:
|
|
649
332
|
high | medium | low
|
|
650
333
|
```
|
|
@@ -666,121 +349,6 @@ For story posts, do not reduce the source to "strong first line" or a generic le
|
|
|
666
349
|
|
|
667
350
|
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`.
|
|
668
351
|
|
|
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 Inspiration Workers
|
|
702
|
-
|
|
703
|
-
Run a separate inspiration analysis 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
|
-
Use one bounded background worker per person when the host supports background
|
|
714
|
-
agents. If not, process the list sequentially. Each worker must keep its output
|
|
715
|
-
compact and must not return a full corpus dump.
|
|
716
|
-
|
|
717
|
-
Worker steps:
|
|
718
|
-
|
|
719
|
-
1. Resolve the person's profile URL or handle from the user input, tracked
|
|
720
|
-
people, or memory. If the user asked for the configured list, resolve from
|
|
721
|
-
`discovery/influencers.md` first. If unresolved, ask for the URL/handle.
|
|
722
|
-
2. Fetch recent posts with `mcp__sellable__fetch_linkedin_posts`.
|
|
723
|
-
3. Fetch profile/follower context with `mcp__sellable__fetch_linkedin_profile`
|
|
724
|
-
when available.
|
|
725
|
-
4. Score the person's recent posts by:
|
|
726
|
-
- topic fit to the user's current idea
|
|
727
|
-
- hook preview strength
|
|
728
|
-
- body payoff strength
|
|
729
|
-
- positioning density
|
|
730
|
-
- repeated success in the same lane
|
|
731
|
-
- engagement quality
|
|
732
|
-
- engagement per 1k followers when follower count is available
|
|
733
|
-
- adaptation fit for Christian/Sellable voice
|
|
734
|
-
- lead-magnet, giveaway, and status-only penalties
|
|
735
|
-
5. Keep max 5 winners and max 5 rejected examples.
|
|
736
|
-
6. Extract hook mechanics, body mechanics, sentence/rhythm moves, proof slots,
|
|
737
|
-
and close moves.
|
|
738
|
-
7. Identify forbidden borrowing: source wording, source proof, jokes, personal
|
|
739
|
-
stories, audience status, and persona markers.
|
|
740
|
-
8. Create one adapted direction for the user's selected premise in
|
|
741
|
-
Christian/Sellable voice.
|
|
742
|
-
|
|
743
|
-
Each configured person must receive a full person-specific packet. Do not
|
|
744
|
-
summarize the group as a single "GTM influencers" research pass. The later
|
|
745
|
-
drafting stage should be able to compare how Alex, Zayd, Tas, Anthony, or any
|
|
746
|
-
other configured person would structurally pressure-test the same Christian
|
|
747
|
-
idea without copying their voice, proof, jokes, or persona.
|
|
748
|
-
|
|
749
|
-
Worker output:
|
|
750
|
-
|
|
751
|
-
```text
|
|
752
|
-
Thought leader inspiration packet:
|
|
753
|
-
person:
|
|
754
|
-
profile_url:
|
|
755
|
-
recent_posts_reviewed:
|
|
756
|
-
follower_count: <number | unavailable>
|
|
757
|
-
normalization_confidence: high | medium | low
|
|
758
|
-
weighted_winners:
|
|
759
|
-
- source_url:
|
|
760
|
-
engagement:
|
|
761
|
-
engagement_per_1k_followers:
|
|
762
|
-
score:
|
|
763
|
-
why_kept:
|
|
764
|
-
first_3_line_preview:
|
|
765
|
-
hook_mechanics:
|
|
766
|
-
body_mechanics:
|
|
767
|
-
sentence_or_rhythm_moves:
|
|
768
|
-
forbidden_borrowing:
|
|
769
|
-
adapted_direction:
|
|
770
|
-
inspiration_adapter:
|
|
771
|
-
voice_layer: Christian/Sellable
|
|
772
|
-
hook_shape:
|
|
773
|
-
body_shape:
|
|
774
|
-
proof_slots_needed:
|
|
775
|
-
why_it_might_win:
|
|
776
|
-
why_it_might_fail:
|
|
777
|
-
rejected_examples:
|
|
778
|
-
confidence_gaps:
|
|
779
|
-
```
|
|
780
|
-
|
|
781
|
-
Do not call the adapted direction "in <person>'s voice." It is an inspiration
|
|
782
|
-
adapter that borrows public mechanics, then writes in the user's voice.
|
|
783
|
-
|
|
784
352
|
## Blocked States
|
|
785
353
|
|
|
786
354
|
Local idea capture can still succeed when research fails.
|
|
@@ -799,9 +367,8 @@ Save the research with `mcp__sellable__save_hook_research` before drafting.
|
|
|
799
367
|
|
|
800
368
|
The saved research must contain enough detail to support a user-visible
|
|
801
369
|
`Research Learning Report`: source examples, full adapted hook blocks, exact
|
|
802
|
-
phrase patterns,
|
|
803
|
-
|
|
804
|
-
tracked-person recommendations, and gold-standard recommendations.
|
|
370
|
+
phrase patterns, body structures, rejected examples, tracked-person
|
|
371
|
+
recommendations, and gold-standard recommendations.
|
|
805
372
|
|
|
806
373
|
If the user approves a creator/person as a recurring inspiration source, also
|
|
807
374
|
call `mcp__sellable__upsert_engage_tracked_person` with:
|