@sellable/mcp 0.1.257 → 0.1.259
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/index-dev.js +0 -0
- package/dist/index.js +0 -0
- 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 +0 -21
- package/dist/tools/engage-discovery.js +9 -136
- package/dist/tools/leads.d.ts +381 -21
- package/dist/tools/leads.js +219 -5
- package/dist/tools/registry.d.ts +207 -23
- 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 +21 -67
- package/skills/create-post/references/gold-standard-post-pack.md +0 -11
- package/skills/create-post/references/hook-research-playbook.md +15 -205
- package/skills/create-post/references/post-file-contract.md +0 -12
- package/skills/create-post/references/post-validation.md +14 -101
- package/skills/find-leads/SKILL.md +6 -0
- package/skills/create-post/references/linkedin-preview-rendering.md +0 -163
- package/skills/research/config.json +0 -9
|
@@ -84,7 +84,6 @@ Before drafting, load all required assets with `mcp__sellable__get_subskill_asse
|
|
|
84
84
|
3. `subskillName: "create-post", assetPath: "references/premise-development.md"`
|
|
85
85
|
4. `subskillName: "create-post", assetPath: "references/post-validation.md"`
|
|
86
86
|
5. `subskillName: "create-post", assetPath: "references/gold-standard-post-pack.md"`
|
|
87
|
-
6. `subskillName: "create-post", assetPath: "references/linkedin-preview-rendering.md"`
|
|
88
87
|
|
|
89
88
|
If any required asset is missing, unreadable, truncated without continuation, or internally inconsistent, return:
|
|
90
89
|
|
|
@@ -305,8 +304,7 @@ If local idea capture succeeds but auth/workspace is missing, keep the idea and
|
|
|
305
304
|
|
|
306
305
|
## Step 1: Hook Research
|
|
307
306
|
|
|
308
|
-
Use `references/hook-research-playbook.md
|
|
309
|
-
`references/linkedin-preview-rendering.md`.
|
|
307
|
+
Use `references/hook-research-playbook.md`.
|
|
310
308
|
|
|
311
309
|
If the host supports background agents, delegate the search/fetch/autopsy work
|
|
312
310
|
to one bounded `research-worker` before hook candidate generation. The worker
|
|
@@ -321,10 +319,9 @@ The research worker must return a compact packet only:
|
|
|
321
319
|
- full adapted hook blocks
|
|
322
320
|
- market belief map: resonating ideas, implicit beliefs, audience wants, resentments, fears, and credible controversy angles
|
|
323
321
|
- premise inputs: real scenes, observed tensions, reader value openings, and proof gaps
|
|
324
|
-
- reach-normalized signal notes, including follower-band fit when available
|
|
325
322
|
- exact phrase patterns and sentence shapes
|
|
326
323
|
- body structures and exact body language moves
|
|
327
|
-
-
|
|
324
|
+
- preview measurements
|
|
328
325
|
- track-person and gold-standard recommendations
|
|
329
326
|
- blocked states or confidence gaps
|
|
330
327
|
|
|
@@ -335,20 +332,18 @@ the exact extracted phrase shapes.
|
|
|
335
332
|
Default flow:
|
|
336
333
|
|
|
337
334
|
1. Convert the idea into 3-8 search keywords.
|
|
338
|
-
2. Call `mcp__sellable__search_engagement_posts` with an explicit multi-month window. Default to `maxAgeDays: 120`, tightening to 30-60 days only when the topic is trend-sensitive.
|
|
339
|
-
3. Shortlist posts by topic fit,
|
|
340
|
-
4. Because search results may only include previews, call `mcp__sellable__fetch_linkedin_posts` for shortlisted authors/profile URLs and match recent posts by URL/activity ID when full text is needed.
|
|
335
|
+
2. Call `mcp__sellable__search_engagement_posts` with an explicit multi-month window. Default to `maxAgeDays: 120`, tightening to 30-60 days only when the topic is trend-sensitive.
|
|
336
|
+
3. Shortlist high-engagement posts by topic fit, hook strength, creator repeat evidence, and weighted engagement quality.
|
|
337
|
+
4. Because search results may only include previews, call `mcp__sellable__fetch_linkedin_posts` for shortlisted authors/profile URLs and match recent posts by URL/activity ID when full text is needed.
|
|
341
338
|
5. If full text cannot be matched, record `full_text_unavailable` and use only the preview. Do not invent missing body details.
|
|
342
|
-
6. Weigh shares/reposts above comments, comments above reactions, and reactions as weak reach unless paired with stronger signals.
|
|
339
|
+
6. Weigh shares/reposts above comments, comments above reactions, and reactions as weak reach unless paired with stronger signals. If shares/reposts are unavailable, record `repost_data_unavailable`.
|
|
343
340
|
7. Penalize lead-magnet or giveaway mechanics unless the user explicitly asks for a lead magnet post.
|
|
344
341
|
8. Build a market belief map before hook generation: what the space is rewarding, what the audience implicitly believes, what they want permission to say, what they resent or fear, what they will argue with, and which controversial angle the user can credibly own. If the user's raw idea is internally coherent but not attached to a live market tension, do not draft from the internal idea alone; present stronger directions or rewrite the draft angle around the external tension.
|
|
345
342
|
9. Extract premise inputs: real story/scene possibilities, observed tensions, useful reader takeaways, and proof gaps. A good hook cannot rescue a premise with no value.
|
|
346
343
|
10. For story posts, extract the story mechanism that made the post work, not just the first line.
|
|
347
344
|
11. Extract hook structures plus specific reusable words, phrases, sentence
|
|
348
345
|
shapes, transitions, and body language patterns.
|
|
349
|
-
12.
|
|
350
|
-
preview rendering contract. Character counts alone are not enough.
|
|
351
|
-
13. Save the research with `mcp__sellable__save_hook_research`.
|
|
346
|
+
12. Save the research with `mcp__sellable__save_hook_research`.
|
|
352
347
|
|
|
353
348
|
Record provenance:
|
|
354
349
|
|
|
@@ -357,26 +352,18 @@ Record provenance:
|
|
|
357
352
|
- search window
|
|
358
353
|
- source post URLs
|
|
359
354
|
- authors/profile URLs
|
|
360
|
-
- author follower counts and target follower-band fit when available
|
|
361
355
|
- engagement totals and available likes/comments/shares breakdown
|
|
362
|
-
- reach-normalized scoring fields and confidence notes
|
|
363
356
|
- creator repeat evidence
|
|
364
357
|
- lead-magnet or engagement-bait penalties
|
|
365
358
|
- story mechanism when relevant
|
|
366
359
|
- full-text match status
|
|
367
|
-
- source hook
|
|
368
|
-
authenticated LinkedIn screenshots, or a search preview
|
|
360
|
+
- source hook preview measurements and whether they came from full text or a search preview
|
|
369
361
|
- selected hook patterns
|
|
370
362
|
- market belief map and selected controversy
|
|
371
363
|
- premise cards and selected premise
|
|
372
364
|
- exact phrase patterns and sentence shapes
|
|
373
365
|
- body structures and body language patterns
|
|
374
366
|
- why each pattern fits the user's idea and voice
|
|
375
|
-
- `whyTheHookCarries`: why the selected hook works from the words, tension, and
|
|
376
|
-
content pattern independent of the source creator's reach
|
|
377
|
-
- `whyTheReachEvidenceIsTrustworthy`: follower-band fit, reach-adjusted score,
|
|
378
|
-
baseline lift, share/comment quality, or why a large-account example is only
|
|
379
|
-
secondary pattern evidence
|
|
380
367
|
|
|
381
368
|
## Step 1.5: Research Learning Report
|
|
382
369
|
|
|
@@ -402,9 +389,6 @@ Research status:
|
|
|
402
389
|
- keywords:
|
|
403
390
|
- full-text coverage:
|
|
404
391
|
- repost/share data:
|
|
405
|
-
- target follower band:
|
|
406
|
-
- reach-normalized winners:
|
|
407
|
-
- big-account examples used only as secondary pattern evidence:
|
|
408
392
|
|
|
409
393
|
Best source examples:
|
|
410
394
|
1. author, URL, engagement, why kept, why not copied
|
|
@@ -425,10 +409,7 @@ Premise cards:
|
|
|
425
409
|
Hook patterns learned:
|
|
426
410
|
1. full adapted hook block
|
|
427
411
|
- source mechanism:
|
|
428
|
-
-
|
|
429
|
-
- mobile visible block:
|
|
430
|
-
- desktop visible block:
|
|
431
|
-
- verdict:
|
|
412
|
+
- preview budget:
|
|
432
413
|
- internal question:
|
|
433
414
|
- why it fits / why it does not:
|
|
434
415
|
|
|
@@ -503,15 +484,6 @@ Each hook must include:
|
|
|
503
484
|
- reader value implied
|
|
504
485
|
- source hook pattern
|
|
505
486
|
- why it fits this idea
|
|
506
|
-
- `renderedPreview` using `references/linkedin-preview-rendering.md`
|
|
507
|
-
- `mobileRenderedPreviewBlock`
|
|
508
|
-
- `desktopRenderedPreviewBlock`
|
|
509
|
-
- `mobileRenderedLines`
|
|
510
|
-
- `desktopRenderedLines`
|
|
511
|
-
- `firstScreenPromise`
|
|
512
|
-
- `corePainProofOrCuriosityVisibleMobile`
|
|
513
|
-
- `corePointVisibleMobile`
|
|
514
|
-
- `pointAfterMobileClamp`
|
|
515
487
|
- `charCount`
|
|
516
488
|
- `charCountIncludingNewlines`
|
|
517
489
|
- `firstLineChars`
|
|
@@ -532,39 +504,22 @@ Each hook must include:
|
|
|
532
504
|
|
|
533
505
|
Do not copy source wording. Copy only the structure.
|
|
534
506
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
-
|
|
541
|
-
-
|
|
542
|
-
-
|
|
543
|
-
- line height: `21px`
|
|
544
|
-
- white space: `pre-wrap`
|
|
545
|
-
- overflow wrap: `break-word`
|
|
546
|
-
- review clamp: first 3 rendered text lines
|
|
547
|
-
|
|
548
|
-
Use the rendered gates from `references/linkedin-preview-rendering.md`:
|
|
549
|
-
|
|
550
|
-
- `pass`: the mobile rendered preview shows the pain, proof, or curiosity by
|
|
551
|
-
the end of the first 3 rendered lines, and the core point is understandable
|
|
552
|
-
without opening "see more".
|
|
553
|
-
- `warn`: the mobile rendered preview creates useful curiosity but the core
|
|
554
|
-
point is slightly softened by wrapping, blank-line rhythm, or one missing
|
|
555
|
-
context word. A compact fallback is required.
|
|
556
|
-
- `fail`: the hook's real point appears after the first 3 mobile rendered
|
|
557
|
-
lines, the first rendered line is generic setup, blank lines consume the
|
|
558
|
-
preview before the reader sees the point, or desktop fit is the only reason it
|
|
559
|
-
looks good.
|
|
507
|
+
Use this conservative mobile-first LinkedIn preview gate. LinkedIn does not
|
|
508
|
+
publish exact "see more" cutoff rules, and rendering varies by device, app
|
|
509
|
+
version, font, media, and line break. These are v1 safety budgets, not claims
|
|
510
|
+
about an official LinkedIn limit:
|
|
511
|
+
|
|
512
|
+
- `pass`: hook is <= 110 chars including newlines, every nonblank line is <= 45 chars, and the hook's core point lands before likely truncation.
|
|
513
|
+
- `warn`: hook is 111-140 chars including newlines, any nonblank line is 46-55 chars, or blank lines create visual-line risk. Blank lines are allowed, but they count as physical lines.
|
|
514
|
+
- `fail`: hook is > 140 chars including newlines, any nonblank line is > 55 chars, or the hook's point depends on text after likely truncation.
|
|
560
515
|
|
|
561
516
|
Desktop preview usually has more room. Still record `desktopPreviewFit`, but
|
|
562
517
|
never let desktop fit compensate for a mobile `fail`.
|
|
563
518
|
|
|
564
|
-
If a hook's point depends on text after the
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
519
|
+
If a hook's point depends on text after the likely preview, rewrite it before
|
|
520
|
+
selecting it. A selected hook may carry a `warn` only when the warning is about
|
|
521
|
+
intentional blank-line rhythm or a slight line-length overage; include a compact
|
|
522
|
+
fallback in the validation receipt.
|
|
568
523
|
|
|
569
524
|
## Step 3: Draft
|
|
570
525
|
|
|
@@ -598,7 +553,6 @@ Every saved draft needs a validation receipt with:
|
|
|
598
553
|
- story/proof files consulted
|
|
599
554
|
- gold standards consulted
|
|
600
555
|
- LinkedIn preview audit
|
|
601
|
-
- rendered mobile and desktop hook preview blocks
|
|
602
556
|
- premise/value audit findings
|
|
603
557
|
- simplifier/concrete-language audit findings
|
|
604
558
|
- voice audit findings
|
|
@@ -119,8 +119,6 @@ Show compact candidate cards. Include:
|
|
|
119
119
|
- why it might belong in the pack
|
|
120
120
|
- hook mechanism
|
|
121
121
|
- hook preview budget status and measurement basis
|
|
122
|
-
- rendered mobile preview block and verdict
|
|
123
|
-
- rendered desktop preview block and verdict
|
|
124
122
|
- content/body mechanism
|
|
125
123
|
- rhythm notes
|
|
126
124
|
- sentence-structure notes
|
|
@@ -196,15 +194,6 @@ Tags:
|
|
|
196
194
|
- longest nonblank line chars:
|
|
197
195
|
- blank-line visual risk:
|
|
198
196
|
- source text basis:
|
|
199
|
-
- render basis:
|
|
200
|
-
- css contract version:
|
|
201
|
-
- mobile rendered preview block:
|
|
202
|
-
- desktop rendered preview block:
|
|
203
|
-
- mobile rendered lines:
|
|
204
|
-
- desktop rendered lines:
|
|
205
|
-
- core pain/proof/curiosity visible on mobile:
|
|
206
|
-
- core point visible on mobile:
|
|
207
|
-
- point after mobile clamp:
|
|
208
197
|
- preview budget status:
|
|
209
198
|
- mobile preview fit:
|
|
210
199
|
- desktop preview fit:
|
|
@@ -28,11 +28,10 @@ Worker owns:
|
|
|
28
28
|
- tracked-person post fetches
|
|
29
29
|
- full-text matching by URL/activity ID
|
|
30
30
|
- duplicate removal
|
|
31
|
-
- follower-band and reach-normalized signal scoring
|
|
32
31
|
- lead-magnet, giveaway, engagement-bait, and off-voice filtering
|
|
33
32
|
- market belief mapping across kept and rejected examples
|
|
34
33
|
- premise input extraction: real scenes, observed tensions, reader value, proof gaps
|
|
35
|
-
-
|
|
34
|
+
- hook opening measurement
|
|
36
35
|
- exact phrase-pattern extraction
|
|
37
36
|
- body-structure extraction
|
|
38
37
|
- rejected-example notes
|
|
@@ -59,8 +58,7 @@ Research packet:
|
|
|
59
58
|
- exact phrase patterns: max 20
|
|
60
59
|
- body patterns: max 8
|
|
61
60
|
- source URLs and author profile URLs
|
|
62
|
-
-
|
|
63
|
-
- rendered preview records
|
|
61
|
+
- preview measurements
|
|
64
62
|
- confidence gaps
|
|
65
63
|
- save recommendations
|
|
66
64
|
```
|
|
@@ -76,13 +74,6 @@ Use `mcp__sellable__search_engagement_posts` with practical constraints:
|
|
|
76
74
|
|
|
77
75
|
- explicit `maxAgeDays: 120` by default so research covers the past 30-120 days, not only this week's posts
|
|
78
76
|
- tighten to 30-60 days for trend-sensitive topics; widen only when the topic has low volume
|
|
79
|
-
- when the user gives a follower range, pass it as `targetFollowerMin` and
|
|
80
|
-
`targetFollowerMax` so the tool can expose reach-normalized signals and
|
|
81
|
-
prioritize comparable creators
|
|
82
|
-
- if a source hook looks promising but follower count is missing, use
|
|
83
|
-
`mcp__sellable__fetch_linkedin_profile` on a bounded shortlist before calling
|
|
84
|
-
the source a keeper; if profile fetch is unavailable or too slow, mark
|
|
85
|
-
`follower_count_unavailable`
|
|
86
77
|
- high enough engagement to matter
|
|
87
78
|
- narrow enough to match the idea
|
|
88
79
|
- enough result depth to see whether a creator has repeated winners, not just one viral outlier
|
|
@@ -91,19 +82,14 @@ Record every keyword, filter, search window, page, and result count.
|
|
|
91
82
|
|
|
92
83
|
## Weighted Signals
|
|
93
84
|
|
|
94
|
-
Rank source posts with a weighted signal view. Do not sort by total engagement
|
|
95
|
-
alone. Use the numeric score to decide which sources deserve study; do not let
|
|
96
|
-
the number choose the final hook by itself.
|
|
85
|
+
Rank source posts with a weighted signal view. Do not sort by total engagement alone.
|
|
97
86
|
|
|
98
87
|
Use this scoring shape:
|
|
99
88
|
|
|
100
89
|
```text
|
|
101
90
|
hook_score =
|
|
102
91
|
topic_fit
|
|
103
|
-
+ rendered_mobile_preview_strength
|
|
104
92
|
+ hook_clarity
|
|
105
|
-
+ content_pattern_replicability
|
|
106
|
-
+ reach_adjusted_evidence
|
|
107
93
|
+ creator_repeat_success
|
|
108
94
|
+ repost_share_strength
|
|
109
95
|
+ comment_quality
|
|
@@ -121,135 +107,6 @@ Guidance:
|
|
|
121
107
|
- If share or repost data is unavailable, record `repost_data_unavailable` instead of inventing it.
|
|
122
108
|
- Prefer creators with repeated high-performing posts in the same lane over one-off viral posts.
|
|
123
109
|
|
|
124
|
-
## Reach-Normalized Hook Scoring
|
|
125
|
-
|
|
126
|
-
Raw engagement is not the clearest signal when source creators have wildly
|
|
127
|
-
different audience sizes. A post from a 100k+ follower creator can win on
|
|
128
|
-
distribution even when the hook is ordinary. A post from a creator near the
|
|
129
|
-
user's follower range that overperforms is a clearer signal that LinkedIn and
|
|
130
|
-
readers rewarded the hook/premise.
|
|
131
|
-
|
|
132
|
-
This calculation is a source-quality filter, not the final creative decision.
|
|
133
|
-
After reach is controlled, the LLM still chooses the hooks to steal based on the
|
|
134
|
-
visible hook, rendered first-screen promise, content pattern, premise fit, and
|
|
135
|
-
whether the idea can carry without the source creator's distribution.
|
|
136
|
-
|
|
137
|
-
When the user gives a target range, default to that range. For example, if the
|
|
138
|
-
user says "8k to 20k followers," call `mcp__sellable__search_engagement_posts`
|
|
139
|
-
with:
|
|
140
|
-
|
|
141
|
-
```text
|
|
142
|
-
targetFollowerMin: 8000
|
|
143
|
-
targetFollowerMax: 20000
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
If the user gives no range, use the user's known follower count from memory or
|
|
147
|
-
ask only when the decision depends on it. If no follower count is available, use
|
|
148
|
-
raw engagement as a fallback and mark `target_follower_band_unknown`.
|
|
149
|
-
|
|
150
|
-
For every shortlisted source post, record:
|
|
151
|
-
|
|
152
|
-
- `authorFollowerCount`
|
|
153
|
-
- `targetFollowerBand`
|
|
154
|
-
- `followerBandFit`: `in_target_band`, `below_target_band`,
|
|
155
|
-
`above_target_band`, or `unknown`
|
|
156
|
-
- `engagementPer1kFollowers`
|
|
157
|
-
- `weightedEngagementPer1kFollowers`
|
|
158
|
-
- `reachAdjustedScore`
|
|
159
|
-
- `creatorBaselineMedianEngagement` when repeated posts from that creator are
|
|
160
|
-
available
|
|
161
|
-
- `baselineLift`: this post's engagement divided by the creator's recent median
|
|
162
|
-
engagement in the same lane, or `creator_baseline_unavailable`
|
|
163
|
-
- `confidence`: `high`, `medium`, or `low`
|
|
164
|
-
- `normalizationNotes`
|
|
165
|
-
|
|
166
|
-
Use this Harvest-compatible calculation when follower counts are available:
|
|
167
|
-
|
|
168
|
-
```text
|
|
169
|
-
weightedEngagement =
|
|
170
|
-
likes
|
|
171
|
-
+ (comments * 4)
|
|
172
|
-
+ (shares * 12)
|
|
173
|
-
|
|
174
|
-
engagementPer1kFollowers =
|
|
175
|
-
totalEngagement / authorFollowerCount * 1000
|
|
176
|
-
|
|
177
|
-
weightedEngagementPer1kFollowers =
|
|
178
|
-
weightedEngagement / authorFollowerCount * 1000
|
|
179
|
-
|
|
180
|
-
reachPenaltyMultiplier =
|
|
181
|
-
1.00 when in target follower band
|
|
182
|
-
0.75 when below target band
|
|
183
|
-
0.65 when above target band but <= 2x target max
|
|
184
|
-
0.35 when above target band but <= 5x target max
|
|
185
|
-
0.15 when above target band and > 5x target max
|
|
186
|
-
0.40 when follower count is unknown
|
|
187
|
-
|
|
188
|
-
reachAdjustedScore =
|
|
189
|
-
weightedEngagementPer1kFollowers * reachPenaltyMultiplier
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
When repeated posts from the same creator are available, calculate:
|
|
193
|
-
|
|
194
|
-
```text
|
|
195
|
-
creatorBaselineMedianEngagement =
|
|
196
|
-
median weightedEngagement across recent same-lane posts
|
|
197
|
-
|
|
198
|
-
baselineLift =
|
|
199
|
-
post weightedEngagement / creatorBaselineMedianEngagement
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
Use this scoring shape when deciding which hooks to study:
|
|
203
|
-
|
|
204
|
-
```text
|
|
205
|
-
hook_score =
|
|
206
|
-
topic_fit
|
|
207
|
-
+ rendered_mobile_preview_strength
|
|
208
|
-
+ hook_clarity
|
|
209
|
-
+ same_follower_band_bonus
|
|
210
|
-
+ weighted_engagement_per_1k_followers
|
|
211
|
-
+ creator_baseline_lift
|
|
212
|
-
+ repost_share_strength
|
|
213
|
-
+ substantive_comment_quality
|
|
214
|
-
+ creator_repeat_success
|
|
215
|
-
- celebrity_reach_penalty
|
|
216
|
-
- tiny_sample_penalty
|
|
217
|
-
- lead_magnet_penalty
|
|
218
|
-
- engagement_bait_penalty
|
|
219
|
-
- off_voice_penalty
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
Rules:
|
|
223
|
-
|
|
224
|
-
- Prefer in-band creators when the hook is strong and the engagement is real.
|
|
225
|
-
- Use near-band creators as secondary evidence.
|
|
226
|
-
- Penalize creators far above the target range, especially accounts above 5x
|
|
227
|
-
the target max or above 100k followers when the target range is 8k-20k.
|
|
228
|
-
- Do not automatically reject large-account posts; they can still teach body
|
|
229
|
-
structure, topic heat, or category language. Do not treat them as primary hook
|
|
230
|
-
proof unless they also overperform their creator baseline.
|
|
231
|
-
- Large-account hooks can be selected only when the hook carries without the
|
|
232
|
-
creator: the rendered mobile opening is strong, the premise is reusable by the
|
|
233
|
-
user, the body pattern does not depend on celebrity authority, and the source
|
|
234
|
-
either beats baseline or has unusually high reach-adjusted quality after the
|
|
235
|
-
penalty.
|
|
236
|
-
- Do not overvalue tiny-account anomalies. Very high engagement per follower
|
|
237
|
-
with low absolute engagement is interesting but lower confidence.
|
|
238
|
-
- When follower data is unavailable, do not invent it. Mark
|
|
239
|
-
`follower_count_unavailable`, lower confidence, and rely more on creator repeat
|
|
240
|
-
evidence, repost/share strength, comment quality, and rendered preview quality.
|
|
241
|
-
- A source hook is strongest when it is in/near the target follower band, has
|
|
242
|
-
real absolute engagement, beats the creator's apparent baseline, has
|
|
243
|
-
share/comment quality, and passes rendered mobile preview.
|
|
244
|
-
|
|
245
|
-
Final hook selection must explain both:
|
|
246
|
-
|
|
247
|
-
- `whyTheHookCarries`: the visible words, specificity, tension, and first-screen
|
|
248
|
-
promise that work independent of reach
|
|
249
|
-
- `whyTheReachEvidenceIsTrustworthy`: follower-band fit, reach-adjusted score,
|
|
250
|
-
baseline lift, share/comment quality, or why a large-account example is only
|
|
251
|
-
secondary pattern evidence
|
|
252
|
-
|
|
253
110
|
Penalize lead-magnet and engagement-bait mechanics unless the user explicitly asks for that style:
|
|
254
111
|
|
|
255
112
|
- `comment "template"` / `comment "guide"` / `comment "playbook"`
|
|
@@ -341,48 +198,24 @@ Measure the visible opening for every shortlisted source post before extracting
|
|
|
341
198
|
the hook pattern. This makes the study useful for LinkedIn, not just generally
|
|
342
199
|
"good writing."
|
|
343
200
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
or generated hook is not properly studied until it has a rendered mobile and
|
|
347
|
-
desktop preview record.
|
|
348
|
-
|
|
349
|
-
Default deterministic renderer for unpublished drafts and research comparison:
|
|
201
|
+
LinkedIn does not publish exact "see more" cutoff rules. Treat these as
|
|
202
|
+
conservative v1 planning budgets:
|
|
350
203
|
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
line
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
desktop text width: 582px
|
|
359
|
-
review clamp: first 3 rendered text lines
|
|
360
|
-
```
|
|
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.
|
|
361
211
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
below so another agent can compare hooks without re-opening LinkedIn.
|
|
365
|
-
|
|
366
|
-
Desktop preview has more room, but never let desktop fit compensate for a
|
|
367
|
-
mobile `fail`.
|
|
212
|
+
Desktop preview has more room, so record it separately, but never let desktop
|
|
213
|
+
fit compensate for a mobile `fail`.
|
|
368
214
|
|
|
369
215
|
For each source, record:
|
|
370
216
|
|
|
371
217
|
- `sourceTextBasis`: `full_text`, `search_preview`, or `manual_user_source`
|
|
372
218
|
- `openingTextUsed`
|
|
373
|
-
- `renderedPreview`
|
|
374
|
-
- `cssContractVersion`
|
|
375
|
-
- `mobileRenderedPreviewBlock`
|
|
376
|
-
- `desktopRenderedPreviewBlock`
|
|
377
|
-
- `mobileRenderedLines`
|
|
378
|
-
- `desktopRenderedLines`
|
|
379
|
-
- `mobileRenderedLineCount`
|
|
380
|
-
- `desktopRenderedLineCount`
|
|
381
|
-
- `corePainProofOrCuriosityVisibleMobile`
|
|
382
|
-
- `corePainProofOrCuriosityVisibleDesktop`
|
|
383
|
-
- `corePointVisibleMobile`
|
|
384
|
-
- `corePointVisibleDesktop`
|
|
385
|
-
- `pointAfterMobileClamp`
|
|
386
219
|
- `charCountIncludingNewlines`
|
|
387
220
|
- `physicalLineCount`
|
|
388
221
|
- `contentLineCount`
|
|
@@ -395,25 +228,11 @@ For each source, record:
|
|
|
395
228
|
- `desktopPreviewBudget`: `pass`, `warn`, or `fail`
|
|
396
229
|
- `blankLineVisualRisk`
|
|
397
230
|
- `corePointBeforeLikelyTruncation`
|
|
398
|
-
- `renderedPreviewVerdict`: `pass`, `warn`, or `fail`
|
|
399
231
|
|
|
400
232
|
If only a search preview is available, do not pretend the opening is complete.
|
|
401
233
|
Record `sourceTextBasis: search_preview` and lower confidence when the hook
|
|
402
234
|
appears cut off or body context is unavailable.
|
|
403
235
|
|
|
404
|
-
Pass/warn/fail is based on rendered output:
|
|
405
|
-
|
|
406
|
-
- `pass`: the mobile rendered preview shows the pain, proof, or curiosity by
|
|
407
|
-
the end of the first 3 rendered lines, and the core point is understandable
|
|
408
|
-
without opening "see more".
|
|
409
|
-
- `warn`: the mobile rendered preview creates useful curiosity but the core
|
|
410
|
-
point is slightly softened by wrapping, blank-line rhythm, or one missing
|
|
411
|
-
context word. A compact fallback is required.
|
|
412
|
-
- `fail`: the hook's real point appears after the first 3 mobile rendered
|
|
413
|
-
lines, the first rendered line is generic setup, blank lines consume the
|
|
414
|
-
preview before the reader sees the point, or desktop fit is the only reason it
|
|
415
|
-
looks good.
|
|
416
|
-
|
|
417
236
|
## Hook Extraction
|
|
418
237
|
|
|
419
238
|
Extract structure and reusable language patterns, not copied prose. The goal is
|
|
@@ -426,13 +245,10 @@ For each shortlisted source post, record:
|
|
|
426
245
|
- URL
|
|
427
246
|
- author
|
|
428
247
|
- author profile URL when available
|
|
429
|
-
- author follower count and follower-band fit when available
|
|
430
248
|
- engagement totals and available likes/comments/shares breakdown
|
|
431
|
-
- reach-normalized metrics: engagement per 1k followers, weighted engagement
|
|
432
|
-
per 1k followers, reach-adjusted score, baseline lift, and confidence
|
|
433
249
|
- creator repeat evidence
|
|
434
250
|
- visible hook text or preview
|
|
435
|
-
-
|
|
251
|
+
- opening preview measurement fields from the section above
|
|
436
252
|
- hook mechanism
|
|
437
253
|
- exact hook language patterns: reusable words, phrase shapes, contrast forms,
|
|
438
254
|
sentence shapes, and transition moves
|
|
@@ -442,16 +258,10 @@ For each shortlisted source post, record:
|
|
|
442
258
|
- proof/story dependency
|
|
443
259
|
- lead magnet or engagement bait penalty
|
|
444
260
|
- weighted signal notes
|
|
445
|
-
- reach-normalized signal notes
|
|
446
261
|
- replicability score
|
|
447
262
|
- track person recommendation: `yes`, `no`, or `ask_user`
|
|
448
263
|
- tracking reason when recommended
|
|
449
264
|
|
|
450
|
-
Do not call a source hook a keeper because the full text is strong if the
|
|
451
|
-
rendered mobile opening is weak. Study what a LinkedIn reader sees before
|
|
452
|
-
"see more"; the body structure can still be useful, but the hook should not be
|
|
453
|
-
copied into the hook pattern set.
|
|
454
|
-
|
|
455
265
|
## Specific Language Extraction
|
|
456
266
|
|
|
457
267
|
For each keeper, extract the source's specific language mechanics in this
|
|
@@ -59,19 +59,10 @@ Hook research files must preserve:
|
|
|
59
59
|
- source post URLs
|
|
60
60
|
- author/profile URLs
|
|
61
61
|
- engagement totals
|
|
62
|
-
- author follower counts when available, target follower band, follower-band
|
|
63
|
-
fit, engagement per 1k followers, weighted engagement per 1k followers,
|
|
64
|
-
reach penalty multiplier, reach-adjusted score, baseline lift when available,
|
|
65
|
-
why the hook carries independent of creator reach, and normalization
|
|
66
|
-
confidence notes
|
|
67
62
|
- full-text availability
|
|
68
63
|
- source hook preview measurements, including text basis, char count including
|
|
69
64
|
newlines, physical/content line counts, longest nonblank line, blank-line
|
|
70
65
|
visual risk, and mobile/desktop preview budget status
|
|
71
|
-
- rendered preview records for every kept source hook and adapted hook block,
|
|
72
|
-
including literal mobile/desktop preview blocks, rendered line wraps, render
|
|
73
|
-
basis, CSS contract version, text widths, first-screen promise visibility,
|
|
74
|
-
core point visibility, and whether the point lands after the mobile clamp
|
|
75
66
|
- extracted hook patterns
|
|
76
67
|
- selected hook basis
|
|
77
68
|
|
|
@@ -92,9 +83,6 @@ Draft files must preserve:
|
|
|
92
83
|
- draft body
|
|
93
84
|
- validation receipt, including LinkedIn preview pass/warn/fail status and
|
|
94
85
|
compact fallback when the selected hook carries a warning
|
|
95
|
-
- rendered mobile and desktop preview blocks for the selected hook; drafts
|
|
96
|
-
cannot be ready when this rendered-preview audit is missing or fails mobile
|
|
97
|
-
visibility
|
|
98
86
|
- status: `draft`, `ready`, `needs_revision`, `published`, or `archived`
|
|
99
87
|
|
|
100
88
|
Multiple drafts for the same idea are expected. Keep the `ideaId` stable and
|