@sellable/mcp 0.1.269 → 0.1.272

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