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