@sellable/mcp 0.1.259 → 0.1.261

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
 
@@ -31,9 +44,13 @@ Worker owns:
31
44
  - lead-magnet, giveaway, engagement-bait, and off-voice filtering
32
45
  - market belief mapping across kept and rejected examples
33
46
  - premise input extraction: real scenes, observed tensions, reader value, proof gaps
34
- - hook opening measurement
47
+ - hook opening measurement and "see more" tension autopsy
35
48
  - exact phrase-pattern extraction
49
+ - post positioning breakdown by line and phrase
50
+ - viral-post outline extraction
51
+ - line-to-template conversion
36
52
  - body-structure extraction
53
+ - body-expression input extraction for the later draft lab
37
54
  - rejected-example notes
38
55
  - track-person and gold-standard recommendations
39
56
 
@@ -56,9 +73,14 @@ Research packet:
56
73
  - premise inputs: max 8
57
74
  - full adapted hook blocks: max 12
58
75
  - exact phrase patterns: max 20
76
+ - post positioning breakdowns: max 8
77
+ - viral-post outlines: max 8
78
+ - reusable post templates: max 8
59
79
  - body patterns: max 8
60
80
  - source URLs and author profile URLs
61
81
  - preview measurements
82
+ - hook-to-body promise maps
83
+ - body expression inputs
62
84
  - confidence gaps
63
85
  - save recommendations
64
86
  ```
@@ -118,6 +140,40 @@ Penalize lead-magnet and engagement-bait mechanics unless the user explicitly as
118
140
  - "like and comment"
119
141
  - broad giveaway framing that makes engagement inflate without proving the hook/body worked
120
142
 
143
+ ## Keeper Threshold
144
+
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.
148
+
149
+ Keeper fields:
150
+
151
+ ```text
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:
170
+ ```
171
+
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.
176
+
121
177
  ## Market Belief Map
122
178
 
123
179
  Before selecting a hook or writing a draft, synthesize a market belief map from
@@ -228,6 +284,13 @@ For each source, record:
228
284
  - `desktopPreviewBudget`: `pass`, `warn`, or `fail`
229
285
  - `blankLineVisualRisk`
230
286
  - `corePointBeforeLikelyTruncation`
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"
231
294
 
232
295
  If only a search preview is available, do not pretend the opening is complete.
233
296
  Record `sourceTextBasis: search_preview` and lower confidence when the hook
@@ -250,6 +313,9 @@ For each shortlisted source post, record:
250
313
  - visible hook text or preview
251
314
  - opening preview measurement fields from the section above
252
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
253
319
  - exact hook language patterns: reusable words, phrase shapes, contrast forms,
254
320
  sentence shapes, and transition moves
255
321
  - story mechanism when the post is a story
@@ -304,6 +370,161 @@ Never reduce this section to high-level labels like "contrarian" or
304
370
  "founder story." Those labels are allowed only after the exact phrase mechanics
305
371
  are captured.
306
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
+
307
528
  ## Body Structure Extraction
308
529
 
309
530
  For each keeper with full text available, extract the body in this format:
@@ -315,6 +536,9 @@ Body pattern:
315
536
  Source:
316
537
  <author + URL>
317
538
 
539
+ Positioning sequence:
540
+ <Context -> Proof -> Problem -> Mechanism -> Benefit ...>
541
+
318
542
  Sequence:
319
543
  1. <paragraph/job 1>
320
544
  2. <paragraph/job 2>
@@ -328,6 +552,13 @@ Exact language moves:
328
552
  Adapted body move:
329
553
  <how this would show up in the user's post>
330
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
+
331
562
  Replicability:
332
563
  high | medium | low
333
564
  ```
@@ -349,6 +580,38 @@ For story posts, do not reduce the source to "strong first line" or a generic le
349
580
 
350
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`.
351
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
+
352
615
  ## Blocked States
353
616
 
354
617
  Local idea capture can still succeed when research fails.
@@ -367,8 +630,9 @@ Save the research with `mcp__sellable__save_hook_research` before drafting.
367
630
 
368
631
  The saved research must contain enough detail to support a user-visible
369
632
  `Research Learning Report`: source examples, full adapted hook blocks, exact
370
- phrase patterns, body structures, rejected examples, tracked-person
371
- 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.
372
636
 
373
637
  If the user approves a creator/person as a recurring inspiration source, also
374
638
  call `mcp__sellable__upsert_engage_tracked_person` with:
@@ -0,0 +1,176 @@
1
+ # LinkedIn Preview Rendering
2
+
3
+ This asset defines the required rendered-preview contract for create-post hook
4
+ research, hook candidate generation, gold-standard decomposition, and draft
5
+ validation.
6
+
7
+ Character budgets are only diagnostics. They are not the preview gate. A hook is
8
+ not studied, selected, or ready until it has been rendered through this contract
9
+ or through a stricter authenticated LinkedIn screenshot.
10
+
11
+ ## Rendering Basis
12
+
13
+ LinkedIn does not publish exact feed truncation rules, and rendering can vary by
14
+ surface, app version, device, media attachment, and account state. Use this
15
+ deterministic renderer as the MCP review gate for unpublished drafts.
16
+
17
+ When an authenticated LinkedIn feed/composer/browser screenshot is available,
18
+ that screenshot is the strongest evidence. Still record the fields below so
19
+ future agents can compare candidates without redoing the visual inspection.
20
+
21
+ Observed public LinkedIn post text style for feed-style post pages:
22
+
23
+ ```text
24
+ selector basis: p.attributed-text-segment-list__content
25
+ font family: -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
26
+ "Fira Sans", Ubuntu, "Oxygen Sans", Cantarell, "Droid Sans",
27
+ "Lucida Grande", Helvetica, Arial, sans-serif
28
+ font size: 14px
29
+ line height: 21px
30
+ font weight: 400
31
+ letter spacing: normal
32
+ white space: pre-wrap
33
+ overflow wrap: break-word
34
+ text color: rgba(0, 0, 0, 0.9)
35
+ mobile text width: 308px
36
+ desktop text width: 582px
37
+ review clamp: first 3 rendered text lines
38
+ ```
39
+
40
+ The `review clamp` is not an official LinkedIn rule. It is the conservative
41
+ apples-to-apples region create-post must use when comparing hooks. Do not let a
42
+ desktop pass rescue a mobile fail.
43
+
44
+ ## Required Rendering Record
45
+
46
+ Every shortlisted source hook, adapted hook block, generated hook candidate, and
47
+ selected hook must include a `renderedPreview` record:
48
+
49
+ ```text
50
+ renderedPreview:
51
+ basis: linkedin_css_contract | authenticated_linkedin_screenshot | manual_user_source
52
+ cssContractVersion: linkedin-preview-rendering/v1
53
+ mobile:
54
+ textWidthPx: 308
55
+ fontSizePx: 14
56
+ lineHeightPx: 21
57
+ visibleTextBlock: <literal first rendered review-clamp block>
58
+ renderedLines:
59
+ - <line 1 exactly as wrapped>
60
+ - <line 2 exactly as wrapped>
61
+ - <line 3 exactly as wrapped>
62
+ lineCountBeforeClamp: <number>
63
+ blankLinesBeforeClamp: <number>
64
+ corePainProofOrCuriosityVisible: true | false
65
+ corePointVisible: true | false
66
+ intentionalOpenLoop: true | false
67
+ specificClickQuestionVisible: true | false
68
+ payoffPlannedImmediatelyAfterClamp: true | false
69
+ seeMoreClickReason: <why a reader would click see more>
70
+ seeMoreRisk: pass | warn | fail
71
+ screenshotPath: <optional local path>
72
+ desktop:
73
+ textWidthPx: 582
74
+ fontSizePx: 14
75
+ lineHeightPx: 21
76
+ visibleTextBlock: <literal first rendered review-clamp block>
77
+ renderedLines:
78
+ - <line 1 exactly as wrapped>
79
+ - <line 2 exactly as wrapped>
80
+ - <line 3 exactly as wrapped>
81
+ lineCountBeforeClamp: <number>
82
+ blankLinesBeforeClamp: <number>
83
+ corePainProofOrCuriosityVisible: true | false
84
+ corePointVisible: true | false
85
+ seeMoreRisk: pass | warn | fail
86
+ screenshotPath: <optional local path>
87
+ diagnostics:
88
+ charCount: <number>
89
+ charCountIncludingNewlines: <number>
90
+ firstLineChars: <number>
91
+ firstTwoPhysicalLinesChars: <number>
92
+ longestNonblankLineChars: <number>
93
+ blankLineVisualRisk: none | low | medium | high
94
+ pointAfterMobileClamp: true | false
95
+ openLoopType: none | hidden_payoff | contradiction | proof_gap | workflow_reveal | asset_reveal | story_gap
96
+ rewriteIfTruncated: <short fallback>
97
+ ```
98
+
99
+ If a host cannot produce screenshots, it must still produce the literal wrapped
100
+ line blocks using the CSS contract. If it cannot produce either screenshots or
101
+ literal line wraps, return `blocked` or `needs_revision`; do not claim the hook
102
+ passed preview validation from character counts alone.
103
+
104
+ ## Study Rules
105
+
106
+ For source-post research:
107
+
108
+ - Render the exact visible opening from full text when full text is available.
109
+ - If only a search preview is available, render only the preview text and set
110
+ `basis: manual_user_source` or record `sourceTextBasis: search_preview`.
111
+ - Lower confidence when the search preview is cut off or the body is
112
+ unavailable.
113
+ - Extract hook lessons from the rendered first-screen experience, not from the
114
+ full post in isolation.
115
+
116
+ For generated hooks:
117
+
118
+ - Generate the hook from the selected premise first.
119
+ - Render the hook for mobile and desktop before scoring it.
120
+ - Score the rendered first-screen click reason before scoring cleverness.
121
+ - If the goal is see-more clicks, the hook may intentionally hide the payoff
122
+ after the mobile clamp, but the visible block must create a specific question
123
+ the target reader wants answered.
124
+ - Rewrite any candidate whose real point appears after the mobile clamp unless
125
+ that point is the planned payoff for an intentional open loop.
126
+
127
+ ## Pass, Warn, Fail
128
+
129
+ Use these rendered gates:
130
+
131
+ - `pass`: the mobile rendered preview shows the pain, proof, or curiosity by the
132
+ end of the first 3 rendered lines, and either the core point is
133
+ understandable without opening "see more" or an intentional open loop creates
134
+ a specific click question with an immediate planned payoff.
135
+ - `warn`: the mobile rendered preview creates useful curiosity but the core
136
+ point or click question is slightly softened by wrapping, blank-line rhythm,
137
+ or one missing context word. A compact fallback is required.
138
+ - `fail`: the hook's real point appears after the first 3 mobile rendered lines,
139
+ the visible open loop is vague, the first rendered line is generic setup,
140
+ blank lines consume the preview before the reader sees the point, or desktop
141
+ fit is the only reason it looks good.
142
+
143
+ A draft cannot be `ready` when the selected hook has:
144
+
145
+ - no `renderedPreview`
146
+ - `mobile.seeMoreRisk: fail`
147
+ - `mobile.corePainProofOrCuriosityVisible: false`
148
+ - `mobile.corePointVisible: false` unless `mobile.intentionalOpenLoop: true`,
149
+ `mobile.specificClickQuestionVisible: true`, and
150
+ `mobile.payoffPlannedImmediatelyAfterClamp: true`
151
+ - `pointAfterMobileClamp: true` unless the point after the clamp is the
152
+ intentional payoff for a specific open loop
153
+
154
+ ## Report Format
155
+
156
+ Research reports must show rendered preview blocks for the best examples and
157
+ recommended draft directions:
158
+
159
+ ```text
160
+ Rendered preview:
161
+ mobile:
162
+ <line 1>
163
+ <line 2>
164
+ <line 3>
165
+
166
+ desktop:
167
+ <line 1>
168
+ <line 2>
169
+ <line 3>
170
+
171
+ verdict: pass | warn | fail
172
+ why: <what is visible before the fold>
173
+ ```
174
+
175
+ Do not say "it fits on mobile" without showing what the mobile reader actually
176
+ sees.
@@ -59,10 +59,17 @@ Hook research files must preserve:
59
59
  - source post URLs
60
60
  - author/profile URLs
61
61
  - engagement totals
62
+ - author follower counts when available, target follower band, follower-band
63
+ fit, engagement per 1k followers, weighted engagement per 1k followers,
64
+ reach-adjusted score, and normalization confidence notes when reach
65
+ normalization was used
62
66
  - full-text availability
63
67
  - source hook preview measurements, including text basis, char count including
64
68
  newlines, physical/content line counts, longest nonblank line, blank-line
65
69
  visual risk, and mobile/desktop preview budget status
70
+ - rendered preview records for kept source hooks and adapted hook blocks,
71
+ including literal mobile/desktop preview blocks and whether the first-screen
72
+ promise is visible
66
73
  - extracted hook patterns
67
74
  - selected hook basis
68
75
 
@@ -81,8 +88,18 @@ Draft files must preserve:
81
88
  - score fields for hook, proof, voice, specificity, skimmability, and publish confidence
82
89
  - `verdict`: `baseline`, `keep`, `revise`, `reject`, `publish_candidate`, or a similarly explicit state
83
90
  - draft body
91
+ - pre-draft narrative outline: hierarchical `I.`, `A.`, `i.` outline covering
92
+ hook debt, thesis, reader, core mechanism, definitions, proof claims,
93
+ working body patterns adapted, narrative beats, mobile scan path, body
94
+ promise, concrete examples, abstractions to remove, and draft risks
84
95
  - validation receipt, including LinkedIn preview pass/warn/fail status and
85
96
  compact fallback when the selected hook carries a warning
97
+ - visible flow trace when the user asked for whole-flow, debug, or step-by-step
98
+ mode, including checkpoint statuses, quality break, downstream effect, and
99
+ whether the trace was shown before saving
100
+ - rendered mobile and desktop preview blocks for the selected hook; drafts
101
+ cannot be ready when this rendered-preview audit is missing or fails mobile
102
+ visibility
86
103
  - status: `draft`, `ready`, `needs_revision`, `published`, or `archived`
87
104
 
88
105
  Multiple drafts for the same idea are expected. Keep the `ideaId` stable and