@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.
- package/dist/server.js +4 -1
- package/dist/tools/csv-dnc.d.ts +36 -0
- package/dist/tools/csv-dnc.js +94 -2
- package/dist/tools/engage-discovery.d.ts +21 -18
- package/dist/tools/engage-discovery.js +90 -112
- package/dist/tools/leads.d.ts +381 -21
- package/dist/tools/leads.js +219 -5
- package/dist/tools/registry.d.ts +213 -21
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +6 -0
- package/skills/create-campaign-v2/references/filter-leads.md +2 -0
- package/skills/create-campaign-v2/references/lead-validation-preview.md +2 -0
- package/skills/create-campaign-v2/references/step-13-import-leads.md +3 -1
- package/skills/create-post/SKILL.md +147 -120
- package/skills/create-post/references/gold-standard-post-pack.md +0 -11
- package/skills/create-post/references/hook-research-playbook.md +276 -311
- package/skills/create-post/references/post-file-contract.md +8 -16
- package/skills/create-post/references/post-validation.md +142 -211
- package/skills/create-post/references/premise-development.md +250 -5
- package/skills/find-leads/SKILL.md +6 -0
|
@@ -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
|
|
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
|
-
-
|
|
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
|
-
-
|
|
65
|
-
-
|
|
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
|
-
##
|
|
143
|
+
## Keeper Threshold
|
|
267
144
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
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
|
-
|
|
149
|
+
Keeper fields:
|
|
273
150
|
|
|
274
151
|
```text
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
445
|
-
|
|
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
|
-
|
|
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
|
-
|
|
452
|
-
|
|
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
|
-
- `
|
|
505
|
-
|
|
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
|
-
-
|
|
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,
|
|
670
|
-
|
|
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:
|