@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.
@@ -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` and
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
- - rendered mobile and desktop preview records
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. When the user gives a follower range, pass it as `targetFollowerMin` and `targetFollowerMax`; for example, "8k-20k followers" means `targetFollowerMin: 8000` and `targetFollowerMax: 20000`.
339
- 3. Shortlist posts by topic fit, rendered hook strength, content pattern replicability, creator repeat evidence, weighted engagement quality, and reach-normalized signal quality. Do not sort by raw engagement alone, and do not let the numeric reach score choose the final hook by itself.
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. If a promising source is missing follower count and the user requested reach normalization, call `mcp__sellable__fetch_linkedin_profile` on a bounded shortlist before treating the source as a keeper.
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. Normalize engagement against follower count when available: record `authorFollowerCount`, `targetFollowerBand`, `followerBandFit`, `engagementPer1kFollowers`, `weightedEngagementPer1kFollowers`, `reachPenaltyMultiplier`, `reachAdjustedScore`, and `baselineLift` when repeated creator posts make it possible. If follower count is unavailable, record `follower_count_unavailable`; if shares/reposts are unavailable, record `repost_data_unavailable`.
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. Render each kept source hook and adapted hook block through the LinkedIn
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 rendered preview records and whether they came from full text,
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
- - rendered preview:
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
- Render every candidate before scoring it. The LinkedIn preview rendering
536
- contract is the gate; character counts are secondary diagnostics only. Use the
537
- deterministic CSS contract when no authenticated LinkedIn screenshot is
538
- available:
539
-
540
- - mobile text width: `308px`
541
- - desktop text width: `582px`
542
- - font size: `14px`
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 rendered mobile preview clamp,
565
- rewrite it before selecting it. A selected hook may carry a `warn` only when
566
- the warning is explicit and the validation receipt includes a compact fallback.
567
- A hook with no rendered mobile and desktop preview record cannot be selected.
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
- - rendered hook opening measurement
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
- - reach-normalized signal notes
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
- Use `references/linkedin-preview-rendering.md`. LinkedIn does not publish exact
345
- "see more" cutoff rules. Character counts are diagnostics only. A source post
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
- ```text
352
- cssContractVersion: linkedin-preview-rendering/v1
353
- font size: 14px
354
- line height: 21px
355
- white space: pre-wrap
356
- overflow wrap: break-word
357
- mobile text width: 308px
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
- Authenticated LinkedIn feed/composer screenshots are stronger evidence when
363
- available. If a screenshot is used, still record the wrapped lines and verdicts
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
- - rendered preview fields from the section above
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