@sellable/mcp 0.1.258 → 0.1.260

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.
@@ -1,6 +1,19 @@
1
- # Hook Research Playbook
1
+ # Hook Research Playbook V2
2
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.
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 four 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. viral-post outlines: the narrative structure of each source post
15
+ 4. post positioning breakdown templates: line-level positioning and narrative
16
+ technique maps that can be adapted into the user's draft
4
17
 
5
18
  ## Search Inputs
6
19
 
@@ -28,13 +41,16 @@ Worker owns:
28
41
  - tracked-person post fetches
29
42
  - full-text matching by URL/activity ID
30
43
  - duplicate removal
31
- - follower-band and reach-normalized signal scoring
32
44
  - lead-magnet, giveaway, engagement-bait, and off-voice filtering
33
45
  - market belief mapping across kept and rejected examples
34
46
  - premise input extraction: real scenes, observed tensions, reader value, proof gaps
35
- - rendered hook opening measurement
47
+ - hook opening measurement and "see more" tension autopsy
36
48
  - exact phrase-pattern extraction
49
+ - post positioning breakdown by line and phrase
50
+ - viral-post outline extraction
51
+ - line-to-template conversion
37
52
  - body-structure extraction
53
+ - body-expression input extraction for the later draft lab
38
54
  - rejected-example notes
39
55
  - track-person and gold-standard recommendations
40
56
 
@@ -55,14 +71,16 @@ Research packet:
55
71
  - market belief map: max 8 bullets
56
72
  - controversy candidates: max 8
57
73
  - premise inputs: max 8
58
- - hook reverse-engineering autopsies: max 12
59
74
  - full adapted hook blocks: max 12
60
- - angle territories tested: max 12
61
75
  - exact phrase patterns: max 20
76
+ - post positioning breakdowns: max 8
77
+ - viral-post outlines: max 8
78
+ - reusable post templates: max 8
62
79
  - body patterns: max 8
63
80
  - source URLs and author profile URLs
64
- - reach-normalized signal notes
65
- - rendered preview records
81
+ - preview measurements
82
+ - hook-to-body promise maps
83
+ - body expression inputs
66
84
  - confidence gaps
67
85
  - save recommendations
68
86
  ```
@@ -78,13 +96,6 @@ Use `mcp__sellable__search_engagement_posts` with practical constraints:
78
96
 
79
97
  - explicit `maxAgeDays: 120` by default so research covers the past 30-120 days, not only this week's posts
80
98
  - tighten to 30-60 days for trend-sensitive topics; widen only when the topic has low volume
81
- - when the user gives a follower range, pass it as `targetFollowerMin` and
82
- `targetFollowerMax` so the tool can expose reach-normalized signals and
83
- prioritize comparable creators
84
- - if a source hook looks promising but follower count is missing, use
85
- `mcp__sellable__fetch_linkedin_profile` on a bounded shortlist before calling
86
- the source a keeper; if profile fetch is unavailable or too slow, mark
87
- `follower_count_unavailable`
88
99
  - high enough engagement to matter
89
100
  - narrow enough to match the idea
90
101
  - enough result depth to see whether a creator has repeated winners, not just one viral outlier
@@ -93,19 +104,14 @@ Record every keyword, filter, search window, page, and result count.
93
104
 
94
105
  ## Weighted Signals
95
106
 
96
- Rank source posts with a weighted signal view. Do not sort by total engagement
97
- alone. Use the numeric score to decide which sources deserve study; do not let
98
- the number choose the final hook by itself.
107
+ Rank source posts with a weighted signal view. Do not sort by total engagement alone.
99
108
 
100
109
  Use this scoring shape:
101
110
 
102
111
  ```text
103
112
  hook_score =
104
113
  topic_fit
105
- + rendered_mobile_preview_strength
106
114
  + hook_clarity
107
- + content_pattern_replicability
108
- + reach_adjusted_evidence
109
115
  + creator_repeat_success
110
116
  + repost_share_strength
111
117
  + comment_quality
@@ -123,135 +129,6 @@ Guidance:
123
129
  - If share or repost data is unavailable, record `repost_data_unavailable` instead of inventing it.
124
130
  - Prefer creators with repeated high-performing posts in the same lane over one-off viral posts.
125
131
 
126
- ## Reach-Normalized Hook Scoring
127
-
128
- Raw engagement is not the clearest signal when source creators have wildly
129
- different audience sizes. A post from a 100k+ follower creator can win on
130
- distribution even when the hook is ordinary. A post from a creator near the
131
- user's follower range that overperforms is a clearer signal that LinkedIn and
132
- readers rewarded the hook/premise.
133
-
134
- This calculation is a source-quality filter, not the final creative decision.
135
- After reach is controlled, the LLM still chooses the hooks to steal based on the
136
- visible hook, rendered first-screen promise, content pattern, premise fit, and
137
- whether the idea can carry without the source creator's distribution.
138
-
139
- When the user gives a target range, default to that range. For example, if the
140
- user says "8k to 20k followers," call `mcp__sellable__search_engagement_posts`
141
- with:
142
-
143
- ```text
144
- targetFollowerMin: 8000
145
- targetFollowerMax: 20000
146
- ```
147
-
148
- If the user gives no range, use the user's known follower count from memory or
149
- ask only when the decision depends on it. If no follower count is available, use
150
- raw engagement as a fallback and mark `target_follower_band_unknown`.
151
-
152
- For every shortlisted source post, record:
153
-
154
- - `authorFollowerCount`
155
- - `targetFollowerBand`
156
- - `followerBandFit`: `in_target_band`, `below_target_band`,
157
- `above_target_band`, or `unknown`
158
- - `engagementPer1kFollowers`
159
- - `weightedEngagementPer1kFollowers`
160
- - `reachAdjustedScore`
161
- - `creatorBaselineMedianEngagement` when repeated posts from that creator are
162
- available
163
- - `baselineLift`: this post's engagement divided by the creator's recent median
164
- engagement in the same lane, or `creator_baseline_unavailable`
165
- - `confidence`: `high`, `medium`, or `low`
166
- - `normalizationNotes`
167
-
168
- Use this Harvest-compatible calculation when follower counts are available:
169
-
170
- ```text
171
- weightedEngagement =
172
- likes
173
- + (comments * 4)
174
- + (shares * 12)
175
-
176
- engagementPer1kFollowers =
177
- totalEngagement / authorFollowerCount * 1000
178
-
179
- weightedEngagementPer1kFollowers =
180
- weightedEngagement / authorFollowerCount * 1000
181
-
182
- reachPenaltyMultiplier =
183
- 1.00 when in target follower band
184
- 0.75 when below target band
185
- 0.65 when above target band but <= 2x target max
186
- 0.35 when above target band but <= 5x target max
187
- 0.15 when above target band and > 5x target max
188
- 0.40 when follower count is unknown
189
-
190
- reachAdjustedScore =
191
- weightedEngagementPer1kFollowers * reachPenaltyMultiplier
192
- ```
193
-
194
- When repeated posts from the same creator are available, calculate:
195
-
196
- ```text
197
- creatorBaselineMedianEngagement =
198
- median weightedEngagement across recent same-lane posts
199
-
200
- baselineLift =
201
- post weightedEngagement / creatorBaselineMedianEngagement
202
- ```
203
-
204
- Use this scoring shape when deciding which hooks to study:
205
-
206
- ```text
207
- hook_score =
208
- topic_fit
209
- + rendered_mobile_preview_strength
210
- + hook_clarity
211
- + same_follower_band_bonus
212
- + weighted_engagement_per_1k_followers
213
- + creator_baseline_lift
214
- + repost_share_strength
215
- + substantive_comment_quality
216
- + creator_repeat_success
217
- - celebrity_reach_penalty
218
- - tiny_sample_penalty
219
- - lead_magnet_penalty
220
- - engagement_bait_penalty
221
- - off_voice_penalty
222
- ```
223
-
224
- Rules:
225
-
226
- - Prefer in-band creators when the hook is strong and the engagement is real.
227
- - Use near-band creators as secondary evidence.
228
- - Penalize creators far above the target range, especially accounts above 5x
229
- the target max or above 100k followers when the target range is 8k-20k.
230
- - Do not automatically reject large-account posts; they can still teach body
231
- structure, topic heat, or category language. Do not treat them as primary hook
232
- proof unless they also overperform their creator baseline.
233
- - Large-account hooks can be selected only when the hook carries without the
234
- creator: the rendered mobile opening is strong, the premise is reusable by the
235
- user, the body pattern does not depend on celebrity authority, and the source
236
- either beats baseline or has unusually high reach-adjusted quality after the
237
- penalty.
238
- - Do not overvalue tiny-account anomalies. Very high engagement per follower
239
- with low absolute engagement is interesting but lower confidence.
240
- - When follower data is unavailable, do not invent it. Mark
241
- `follower_count_unavailable`, lower confidence, and rely more on creator repeat
242
- evidence, repost/share strength, comment quality, and rendered preview quality.
243
- - A source hook is strongest when it is in/near the target follower band, has
244
- real absolute engagement, beats the creator's apparent baseline, has
245
- share/comment quality, and passes rendered mobile preview.
246
-
247
- Final hook selection must explain both:
248
-
249
- - `whyTheHookCarries`: the visible words, specificity, tension, and first-screen
250
- promise that work independent of reach
251
- - `whyTheReachEvidenceIsTrustworthy`: follower-band fit, reach-adjusted score,
252
- baseline lift, share/comment quality, or why a large-account example is only
253
- secondary pattern evidence
254
-
255
132
  Penalize lead-magnet and engagement-bait mechanics unless the user explicitly asks for that style:
256
133
 
257
134
  - `comment "template"` / `comment "guide"` / `comment "playbook"`
@@ -263,103 +140,39 @@ Penalize lead-magnet and engagement-bait mechanics unless the user explicitly as
263
140
  - "like and comment"
264
141
  - broad giveaway framing that makes engagement inflate without proving the hook/body worked
265
142
 
266
- ## Hook Reverse Engineering Autopsy
143
+ ## Keeper Threshold
267
144
 
268
- For any space or LinkedIn topic, do not stop at "this is a good hook." Reverse
269
- engineer why the opening earned attention, which shape can be reused, and which
270
- parts belong to the source and must not be copied.
145
+ Only promote a source post into template analysis when it clears a practical
146
+ keeper threshold. A post does not have to be perfect, but it must be useful
147
+ enough that copying its structure would teach the draft something.
271
148
 
272
- For each keeper source hook, record a `hookAutopsy`:
149
+ Keeper fields:
273
150
 
274
151
  ```text
275
- hookAutopsy:
276
- sourceHook: <exact visible opening used for analysis>
277
- renderedFirstScreen: <mobile and desktop visible blocks>
278
- sourceMechanism: <what the hook does structurally>
279
- openLoopType: none | hidden_payoff | contradiction | proof_gap | workflow_reveal | asset_reveal | story_gap
280
- clickQuestion: <the question a reader has before clicking see more>
281
- promisedPayoff: <what the body/video must deliver after the click>
282
- curiosityGap: <what is withheld and why that is fair>
283
- specificityAnchor: <tool, person, number, object, scene, or enemy named>
284
- tensionOpened: <belief, resentment, fear, status, cost, or contradiction>
285
- proofImplied: <what proof the source suggests in the first screen>
286
- whyItWorks: <specific words and structure, not a vibe label>
287
- whyItMightBeInflated: <reach, giveaway, celebrity, outrage, or topic heat>
288
- sourceShapeToKeep: <portable structure, written as a template>
289
- sourceWordsNotToCopy: <phrases, jokes, proof, or context owned by source>
290
- adaptationRule: <how to make it true for the user's idea and voice>
152
+ keeper_score:
153
+ topic_fit: 1-10
154
+ hook_preview_strength: 1-10
155
+ see_more_tension: 1-10
156
+ body_payoff_strength: 1-10 | full_text_unavailable
157
+ positioning_density: 1-10
158
+ creator_repeat_success: 1-10 | unknown
159
+ engagement_quality: 1-10
160
+ replicability_for_user: 1-10
161
+ voice_fit: 1-10
162
+ penalties:
163
+ lead_magnet:
164
+ engagement_bait:
165
+ celebrity_or_account_size_only:
166
+ borrowed_proof:
167
+ body_unavailable:
168
+ verdict: keeper | maybe | reject
169
+ why:
291
170
  ```
292
171
 
293
- Good `sourceShapeToKeep` examples:
294
-
295
- - "The best [desired asset] I have right now is not in [default tool]."
296
- - "I gave [system/person] one prompt: [specific request]."
297
- - "[Common vanity metric] is useless until it becomes [business outcome]."
298
- - "I built [familiar workflow] inside [new interface]."
299
- - "Most teams [surface behavior]. Then they miss [hidden opportunity]."
300
-
301
- Bad autopsies:
302
-
303
- - "contrarian hook"
304
- - "strong curiosity"
305
- - "good storytelling"
306
- - "viral format"
307
-
308
- Those labels are allowed only after the concrete shape, click question, and
309
- payoff obligation are recorded.
310
-
311
- ## Angle Exploration Before Drafting
312
-
313
- After selecting a premise, create a hook angle matrix before drafting the post.
314
- This is mandatory when the user asks to nail the hook, study hooks, explore a
315
- space, or write from a specific idea.
316
-
317
- Default matrix:
318
-
319
- - at least 8 angle territories for normal drafting
320
- - at least 12 angle territories when the user asks for "a ton of angles" or
321
- says the hook is the main constraint
322
- - at least 24 generated hooks across those territories for normal drafting
323
- - at least 40 generated hooks when the user explicitly asks to optimize hooks
324
-
325
- Angle territories should be materially different, not synonyms. Use territories
326
- such as:
327
-
328
- - enemy/tool contrast
329
- - hidden asset
330
- - first-person build proof
331
- - workflow reveal
332
- - contrarian category claim
333
- - mistake/confession
334
- - market timing
335
- - customer/operator pain
336
- - asset/free reveal without comment bait
337
- - specific person/company signal
338
- - before/after transformation
339
- - question hook
340
-
341
- For each territory, record:
342
-
343
- ```text
344
- angleTerritory:
345
- name:
346
- sourceShapesUsed:
347
- premiseTensionOpened:
348
- readerValueImplied:
349
- bestHook:
350
- mobileRenderedPreview:
351
- desktopRenderedPreview:
352
- clickQuestion:
353
- payoffAfterFold:
354
- whyThisAngleShouldWin:
355
- whyThisAngleShouldLose:
356
- proofNeeded:
357
- ```
358
-
359
- Do not write the post body until the winning hook territory is chosen. The post
360
- body must then pay off the selected hook quickly. If the best hook says the list
361
- is not in Apollo, the next lines must reveal where it is. If the hook says "I
362
- gave Sellable one prompt," the next lines must show the prompt or the demo.
172
+ Use `keeper` only when the post has enough hook and body visibility to create a
173
+ template. Use `maybe` when the hook is useful but the body is unavailable or the
174
+ post depends too much on the source creator's status. Use `reject` when the post
175
+ is mostly reach, giveaway mechanics, copied trend language, or poor fit.
363
176
 
364
177
  ## Market Belief Map
365
178
 
@@ -441,54 +254,24 @@ Measure the visible opening for every shortlisted source post before extracting
441
254
  the hook pattern. This makes the study useful for LinkedIn, not just generally
442
255
  "good writing."
443
256
 
444
- Use `references/linkedin-preview-rendering.md`. LinkedIn does not publish exact
445
- "see more" cutoff rules. Character counts are diagnostics only. A source post
446
- or generated hook is not properly studied until it has a rendered mobile and
447
- desktop preview record.
257
+ LinkedIn does not publish exact "see more" cutoff rules. Treat these as
258
+ conservative v1 planning budgets:
448
259
 
449
- Default deterministic renderer for unpublished drafts and research comparison:
260
+ - `pass`: opening hook is <= 110 chars including newlines, every nonblank line
261
+ is <= 45 chars, and the hook's core point lands before likely truncation.
262
+ - `warn`: opening hook is 111-140 chars including newlines, any nonblank line is
263
+ 46-55 chars, or blank lines create visual-line risk. Blank lines are allowed,
264
+ but they count as physical lines.
265
+ - `fail`: opening hook is > 140 chars including newlines, any nonblank line is
266
+ > 55 chars, or the hook's core point depends on text after likely truncation.
450
267
 
451
- ```text
452
- cssContractVersion: linkedin-preview-rendering/v1
453
- font size: 14px
454
- line height: 21px
455
- white space: pre-wrap
456
- overflow wrap: break-word
457
- mobile text width: 308px
458
- desktop text width: 582px
459
- review clamp: first 3 rendered text lines
460
- ```
461
-
462
- Authenticated LinkedIn feed/composer screenshots are stronger evidence when
463
- available. If a screenshot is used, still record the wrapped lines and verdicts
464
- below so another agent can compare hooks without re-opening LinkedIn.
465
-
466
- Desktop preview has more room, but never let desktop fit compensate for a
467
- mobile `fail`.
268
+ Desktop preview has more room, so record it separately, but never let desktop
269
+ fit compensate for a mobile `fail`.
468
270
 
469
271
  For each source, record:
470
272
 
471
273
  - `sourceTextBasis`: `full_text`, `search_preview`, or `manual_user_source`
472
274
  - `openingTextUsed`
473
- - `renderedPreview`
474
- - `cssContractVersion`
475
- - `mobileRenderedPreviewBlock`
476
- - `desktopRenderedPreviewBlock`
477
- - `mobileRenderedLines`
478
- - `desktopRenderedLines`
479
- - `mobileRenderedLineCount`
480
- - `desktopRenderedLineCount`
481
- - `corePainProofOrCuriosityVisibleMobile`
482
- - `corePainProofOrCuriosityVisibleDesktop`
483
- - `corePointVisibleMobile`
484
- - `corePointVisibleDesktop`
485
- - `intentionalOpenLoop`
486
- - `specificClickQuestionVisible`
487
- - `payoffPlannedImmediatelyAfterClamp`
488
- - `seeMoreClickReason`
489
- - `clickQuestion`
490
- - `payoffAfterFold`
491
- - `pointAfterMobileClamp`
492
275
  - `charCountIncludingNewlines`
493
276
  - `physicalLineCount`
494
277
  - `contentLineCount`
@@ -501,28 +284,18 @@ For each source, record:
501
284
  - `desktopPreviewBudget`: `pass`, `warn`, or `fail`
502
285
  - `blankLineVisualRisk`
503
286
  - `corePointBeforeLikelyTruncation`
504
- - `openLoopType`
505
- - `renderedPreviewVerdict`: `pass`, `warn`, or `fail`
287
+ - `seeMoreTension`: what question, contradiction, missing proof, or unfinished
288
+ story makes the reader want the next line
289
+ - `curiosityDebt`: what the hook promises the body must repay
290
+ - `firstScreenPayoffRisk`: whether the hook creates curiosity without enough
291
+ substance to repay it
292
+ - `readerClickReason`: the specific reason a target reader would click "see
293
+ more," not a generic label like "curiosity"
506
294
 
507
295
  If only a search preview is available, do not pretend the opening is complete.
508
296
  Record `sourceTextBasis: search_preview` and lower confidence when the hook
509
297
  appears cut off or body context is unavailable.
510
298
 
511
- Pass/warn/fail is based on rendered output:
512
-
513
- - `pass`: the mobile rendered preview shows the pain, proof, or curiosity by
514
- the end of the first 3 rendered lines, and either the core point is
515
- understandable without opening "see more" or an intentional open loop creates
516
- a specific click question with an immediate planned payoff.
517
- - `warn`: the mobile rendered preview creates useful curiosity but the core
518
- point or click question is slightly softened by wrapping, blank-line rhythm,
519
- or one missing context word. A compact fallback is required.
520
- - `fail`: the hook's real point appears after the first 3 mobile rendered
521
- lines without an intentional open-loop plan, the visible open loop is vague,
522
- the first rendered line is generic setup, blank lines consume the preview
523
- before the reader sees the point, or desktop fit is the only reason it looks
524
- good.
525
-
526
299
  ## Hook Extraction
527
300
 
528
301
  Extract structure and reusable language patterns, not copied prose. The goal is
@@ -535,14 +308,14 @@ For each shortlisted source post, record:
535
308
  - URL
536
309
  - author
537
310
  - author profile URL when available
538
- - author follower count and follower-band fit when available
539
311
  - engagement totals and available likes/comments/shares breakdown
540
- - reach-normalized metrics: engagement per 1k followers, weighted engagement
541
- per 1k followers, reach-adjusted score, baseline lift, and confidence
542
312
  - creator repeat evidence
543
313
  - visible hook text or preview
544
- - rendered preview fields from the section above
314
+ - opening preview measurement fields from the section above
545
315
  - hook mechanism
316
+ - hook promise: what the body is now obligated to prove, reveal, or resolve
317
+ - see-more tension: what makes the reader want the body
318
+ - curiosity debt: what must be repaid quickly after the fold
546
319
  - exact hook language patterns: reusable words, phrase shapes, contrast forms,
547
320
  sentence shapes, and transition moves
548
321
  - story mechanism when the post is a story
@@ -551,16 +324,10 @@ For each shortlisted source post, record:
551
324
  - proof/story dependency
552
325
  - lead magnet or engagement bait penalty
553
326
  - weighted signal notes
554
- - reach-normalized signal notes
555
327
  - replicability score
556
328
  - track person recommendation: `yes`, `no`, or `ask_user`
557
329
  - tracking reason when recommended
558
330
 
559
- Do not call a source hook a keeper because the full text is strong if the
560
- rendered mobile opening is weak. Study what a LinkedIn reader sees before
561
- "see more"; the body structure can still be useful, but the hook should not be
562
- copied into the hook pattern set.
563
-
564
331
  ## Specific Language Extraction
565
332
 
566
333
  For each keeper, extract the source's specific language mechanics in this
@@ -603,6 +370,161 @@ Never reduce this section to high-level labels like "contrarian" or
603
370
  "founder story." Those labels are allowed only after the exact phrase mechanics
604
371
  are captured.
605
372
 
373
+ ## Post Positioning Categories
374
+
375
+ For post research, use the familiar copy-breakdown categories, but apply them to
376
+ public narrative posts instead of landing pages or outbound emails. Assign one
377
+ primary category to every meaningful line or phrase, and add a secondary
378
+ category only when the same phrase clearly does two jobs.
379
+
380
+ Core categories:
381
+
382
+ - `Context`: setup, scene, timing, environment, or "why this is being said now"
383
+ - `Persona`: who the post is for or who appears in the story
384
+ - `Problem`: pain, friction, failure mode, risk, or gap
385
+ - `Alternative`: the old behavior, competitor, default advice, or common path
386
+ - `Belief`: the assumption, status game, worldview, or market consensus being
387
+ entered
388
+ - `Tension`: contradiction, tradeoff, discomfort, open loop, or argument bait
389
+ - `Proof`: numbers, named events, observed outcomes, screenshots, customers,
390
+ repeated experience, or hard-won authority
391
+ - `Mechanism`: the causal explanation for why the thing works or fails
392
+ - `Capability`: the new action the reader, product, or system can perform
393
+ - `Benefit`: positive outcome, leverage, speed, money, clarity, trust, or relief
394
+ - `Feature`: concrete product/workflow object that powers the mechanism
395
+ - `Identity`: founder confession, status shift, taste, vulnerability, or role
396
+ - `Offer`: CTA, invitation, ask, or proposed next step
397
+ - `Bridge`: transition line that moves the reader from hook to proof, from
398
+ proof to lesson, or from lesson to product
399
+
400
+ Do not hide useful detail behind a category label. The category says what the
401
+ line does; the technique notes must explain how the exact words do it.
402
+
403
+ ## Post Positioning Breakdown
404
+
405
+ For every keeper post with enough text, create a line-level breakdown. This is
406
+ the post version of the admin copy-breakdown view: every line becomes a
407
+ positioning and narrative unit that can be templated.
408
+
409
+ Use this format:
410
+
411
+ ```text
412
+ Post positioning breakdown:
413
+ source: <author + URL>
414
+ text_basis: full_text | search_preview | manual_user_source
415
+ overall_positioning_sequence:
416
+ <Category> -> <Category> -> <Category> -> ...
417
+
418
+ line_map:
419
+ 1.
420
+ source_line:
421
+ char_count:
422
+ line_role:
423
+ primary_category:
424
+ secondary_category:
425
+ narrative_technique:
426
+ tension_created:
427
+ reader_question_opened:
428
+ body_promise:
429
+ proof_or_story_dependency:
430
+ why_this_exact_wording_works:
431
+ reusable_template_line:
432
+ adaptation_guard:
433
+ sellable_version_candidate:
434
+ ```
435
+
436
+ Break long lines into phrase-level segments when one line contains multiple
437
+ jobs. Preserve the original source line in the research artifact, but never
438
+ copy it into the draft unless it is the user's own approved post.
439
+
440
+ ## Viral-Post Outline
441
+
442
+ After the line-level breakdown, convert each keeper into a viral-post outline.
443
+ The outline is the narrative skeleton beneath the exact words.
444
+
445
+ Use this format:
446
+
447
+ ```text
448
+ Viral-post outline:
449
+ source: <author + URL>
450
+ outline_name:
451
+ best_for:
452
+ not_good_for:
453
+ hook_job:
454
+ see_more_trigger:
455
+ body_payoff:
456
+ close_job:
457
+
458
+ beats:
459
+ 1.
460
+ beat_name:
461
+ source_lines:
462
+ narrative_job:
463
+ positioning_categories:
464
+ reader_state_before:
465
+ reader_state_after:
466
+ tension_or_open_loop:
467
+ proof_needed:
468
+ reusable_instruction:
469
+ ```
470
+
471
+ Examples of outline names:
472
+
473
+ - proof-first roadmap
474
+ - confession to operating rule
475
+ - enemy naming to mechanism
476
+ - teardown to replacement behavior
477
+ - status reversal to concrete lesson
478
+ - personal scene to category thesis
479
+
480
+ ## Line-To-Template Conversion
481
+
482
+ Convert the source outline into reusable templates that preserve the narrative
483
+ job, not the source creator's language.
484
+
485
+ Use this format:
486
+
487
+ ```text
488
+ Post template:
489
+ source:
490
+ template_name:
491
+ positioning_sequence:
492
+ <Category> -> <Category> -> <Category> -> ...
493
+ required_story_inputs:
494
+ - <input the user must actually have>
495
+ required_proof_inputs:
496
+ - <proof needed to make the template credible>
497
+ forbidden_borrowing:
498
+ - <source proof, joke, phrase, or status that cannot transfer>
499
+
500
+ template_lines:
501
+ 1.
502
+ job:
503
+ line_shape:
504
+ allowed_moves:
505
+ disallowed_moves:
506
+ example_user_adaptation:
507
+ ```
508
+
509
+ The template should be specific enough that another agent can draft from it
510
+ without re-reading the source post. If the template only says "use a contrarian
511
+ hook" or "tell a story," it failed.
512
+
513
+ ## Hook-To-Body Promise Map
514
+
515
+ Every keeper hook must include a map from the preview to the body. This prevents
516
+ the later draft from using a strong opening that the body does not repay.
517
+
518
+ Record:
519
+
520
+ - hook promise: what the hook says or implies the reader will get
521
+ - curiosity debt: what the reader is waiting to learn after clicking
522
+ - first body beat: the first line or paragraph that repays the debt
523
+ - payoff speed: immediate | delayed | too slow
524
+ - tension carried forward: how the body keeps the hook's question alive
525
+ - body betrayal risk: where the body changes topic, gets generic, or overclaims
526
+ - adaptation instruction: how the user's draft must repay the same kind of debt
527
+
606
528
  ## Body Structure Extraction
607
529
 
608
530
  For each keeper with full text available, extract the body in this format:
@@ -614,6 +536,9 @@ Body pattern:
614
536
  Source:
615
537
  <author + URL>
616
538
 
539
+ Positioning sequence:
540
+ <Context -> Proof -> Problem -> Mechanism -> Benefit ...>
541
+
617
542
  Sequence:
618
543
  1. <paragraph/job 1>
619
544
  2. <paragraph/job 2>
@@ -627,6 +552,13 @@ Exact language moves:
627
552
  Adapted body move:
628
553
  <how this would show up in the user's post>
629
554
 
555
+ Body expression inputs:
556
+ - hook promise to repay:
557
+ - narrative beats to preserve:
558
+ - line shapes worth adapting:
559
+ - proof/story slots required:
560
+ - candidate Sellable body lines:
561
+
630
562
  Replicability:
631
563
  high | medium | low
632
564
  ```
@@ -648,6 +580,38 @@ For story posts, do not reduce the source to "strong first line" or a generic le
648
580
 
649
581
  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`.
650
582
 
583
+ ## Template Selection For Drafting
584
+
585
+ After all keeper posts are broken down, select 1-3 source templates for the
586
+ user's idea. Selection is based on fit, not raw engagement.
587
+
588
+ For each selected template, record:
589
+
590
+ ```text
591
+ Selected source template:
592
+ template_name:
593
+ source:
594
+ why_this_template_fits_the_user_story:
595
+ why_it_might_fail:
596
+ positioning_sequence_to_borrow:
597
+ hook_move_to_borrow:
598
+ body_outline_to_borrow:
599
+ line_shapes_to_test:
600
+ required_user_inputs:
601
+ required_proof:
602
+ do_not_copy:
603
+ draft_lab_instruction:
604
+ ```
605
+
606
+ The draft lab instruction should tell the later premise/drafting stage exactly
607
+ how to use the template, for example:
608
+
609
+ ```text
610
+ Use the source's proof-first roadmap sequence, but replace its revenue proof
611
+ with Christian's verified campaign-source ladder. Keep the hook's "unexpected
612
+ best source" tension. Do not borrow the source's dinner/community proof.
613
+ ```
614
+
651
615
  ## Blocked States
652
616
 
653
617
  Local idea capture can still succeed when research fails.
@@ -666,8 +630,9 @@ Save the research with `mcp__sellable__save_hook_research` before drafting.
666
630
 
667
631
  The saved research must contain enough detail to support a user-visible
668
632
  `Research Learning Report`: source examples, full adapted hook blocks, exact
669
- phrase patterns, body structures, rejected examples, tracked-person
670
- recommendations, and gold-standard recommendations.
633
+ phrase patterns, post positioning breakdowns, viral-post outlines, reusable
634
+ post templates, hook-to-body promise maps, body structures, rejected examples,
635
+ tracked-person recommendations, and gold-standard recommendations.
671
636
 
672
637
  If the user approves a creator/person as a recurring inspiration source, also
673
638
  call `mcp__sellable__upsert_engage_tracked_person` with: