@sellable/mcp 0.1.259 → 0.1.261
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/tools/engage-discovery.d.ts +24 -0
- package/dist/tools/engage-discovery.js +114 -9
- package/dist/tools/registry.d.ts +8 -0
- package/package.json +1 -1
- package/skills/create-post/SKILL.md +334 -5
- package/skills/create-post/references/hook-research-playbook.md +269 -5
- package/skills/create-post/references/linkedin-preview-rendering.md +176 -0
- package/skills/create-post/references/post-file-contract.md +17 -0
- package/skills/create-post/references/post-validation.md +177 -8
- package/skills/create-post/references/premise-development.md +256 -5
- package/skills/research/config.json +9 -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
|
|
|
@@ -31,9 +44,13 @@ Worker owns:
|
|
|
31
44
|
- lead-magnet, giveaway, engagement-bait, and off-voice filtering
|
|
32
45
|
- market belief mapping across kept and rejected examples
|
|
33
46
|
- premise input extraction: real scenes, observed tensions, reader value, proof gaps
|
|
34
|
-
- hook opening measurement
|
|
47
|
+
- hook opening measurement and "see more" tension autopsy
|
|
35
48
|
- exact phrase-pattern extraction
|
|
49
|
+
- post positioning breakdown by line and phrase
|
|
50
|
+
- viral-post outline extraction
|
|
51
|
+
- line-to-template conversion
|
|
36
52
|
- body-structure extraction
|
|
53
|
+
- body-expression input extraction for the later draft lab
|
|
37
54
|
- rejected-example notes
|
|
38
55
|
- track-person and gold-standard recommendations
|
|
39
56
|
|
|
@@ -56,9 +73,14 @@ Research packet:
|
|
|
56
73
|
- premise inputs: max 8
|
|
57
74
|
- full adapted hook blocks: max 12
|
|
58
75
|
- exact phrase patterns: max 20
|
|
76
|
+
- post positioning breakdowns: max 8
|
|
77
|
+
- viral-post outlines: max 8
|
|
78
|
+
- reusable post templates: max 8
|
|
59
79
|
- body patterns: max 8
|
|
60
80
|
- source URLs and author profile URLs
|
|
61
81
|
- preview measurements
|
|
82
|
+
- hook-to-body promise maps
|
|
83
|
+
- body expression inputs
|
|
62
84
|
- confidence gaps
|
|
63
85
|
- save recommendations
|
|
64
86
|
```
|
|
@@ -118,6 +140,40 @@ Penalize lead-magnet and engagement-bait mechanics unless the user explicitly as
|
|
|
118
140
|
- "like and comment"
|
|
119
141
|
- broad giveaway framing that makes engagement inflate without proving the hook/body worked
|
|
120
142
|
|
|
143
|
+
## Keeper Threshold
|
|
144
|
+
|
|
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.
|
|
148
|
+
|
|
149
|
+
Keeper fields:
|
|
150
|
+
|
|
151
|
+
```text
|
|
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:
|
|
170
|
+
```
|
|
171
|
+
|
|
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.
|
|
176
|
+
|
|
121
177
|
## Market Belief Map
|
|
122
178
|
|
|
123
179
|
Before selecting a hook or writing a draft, synthesize a market belief map from
|
|
@@ -228,6 +284,13 @@ For each source, record:
|
|
|
228
284
|
- `desktopPreviewBudget`: `pass`, `warn`, or `fail`
|
|
229
285
|
- `blankLineVisualRisk`
|
|
230
286
|
- `corePointBeforeLikelyTruncation`
|
|
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"
|
|
231
294
|
|
|
232
295
|
If only a search preview is available, do not pretend the opening is complete.
|
|
233
296
|
Record `sourceTextBasis: search_preview` and lower confidence when the hook
|
|
@@ -250,6 +313,9 @@ For each shortlisted source post, record:
|
|
|
250
313
|
- visible hook text or preview
|
|
251
314
|
- opening preview measurement fields from the section above
|
|
252
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
|
|
253
319
|
- exact hook language patterns: reusable words, phrase shapes, contrast forms,
|
|
254
320
|
sentence shapes, and transition moves
|
|
255
321
|
- story mechanism when the post is a story
|
|
@@ -304,6 +370,161 @@ Never reduce this section to high-level labels like "contrarian" or
|
|
|
304
370
|
"founder story." Those labels are allowed only after the exact phrase mechanics
|
|
305
371
|
are captured.
|
|
306
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
|
+
|
|
307
528
|
## Body Structure Extraction
|
|
308
529
|
|
|
309
530
|
For each keeper with full text available, extract the body in this format:
|
|
@@ -315,6 +536,9 @@ Body pattern:
|
|
|
315
536
|
Source:
|
|
316
537
|
<author + URL>
|
|
317
538
|
|
|
539
|
+
Positioning sequence:
|
|
540
|
+
<Context -> Proof -> Problem -> Mechanism -> Benefit ...>
|
|
541
|
+
|
|
318
542
|
Sequence:
|
|
319
543
|
1. <paragraph/job 1>
|
|
320
544
|
2. <paragraph/job 2>
|
|
@@ -328,6 +552,13 @@ Exact language moves:
|
|
|
328
552
|
Adapted body move:
|
|
329
553
|
<how this would show up in the user's post>
|
|
330
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
|
+
|
|
331
562
|
Replicability:
|
|
332
563
|
high | medium | low
|
|
333
564
|
```
|
|
@@ -349,6 +580,38 @@ For story posts, do not reduce the source to "strong first line" or a generic le
|
|
|
349
580
|
|
|
350
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`.
|
|
351
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
|
+
|
|
352
615
|
## Blocked States
|
|
353
616
|
|
|
354
617
|
Local idea capture can still succeed when research fails.
|
|
@@ -367,8 +630,9 @@ Save the research with `mcp__sellable__save_hook_research` before drafting.
|
|
|
367
630
|
|
|
368
631
|
The saved research must contain enough detail to support a user-visible
|
|
369
632
|
`Research Learning Report`: source examples, full adapted hook blocks, exact
|
|
370
|
-
phrase patterns,
|
|
371
|
-
|
|
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.
|
|
372
636
|
|
|
373
637
|
If the user approves a creator/person as a recurring inspiration source, also
|
|
374
638
|
call `mcp__sellable__upsert_engage_tracked_person` with:
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# LinkedIn Preview Rendering
|
|
2
|
+
|
|
3
|
+
This asset defines the required rendered-preview contract for create-post hook
|
|
4
|
+
research, hook candidate generation, gold-standard decomposition, and draft
|
|
5
|
+
validation.
|
|
6
|
+
|
|
7
|
+
Character budgets are only diagnostics. They are not the preview gate. A hook is
|
|
8
|
+
not studied, selected, or ready until it has been rendered through this contract
|
|
9
|
+
or through a stricter authenticated LinkedIn screenshot.
|
|
10
|
+
|
|
11
|
+
## Rendering Basis
|
|
12
|
+
|
|
13
|
+
LinkedIn does not publish exact feed truncation rules, and rendering can vary by
|
|
14
|
+
surface, app version, device, media attachment, and account state. Use this
|
|
15
|
+
deterministic renderer as the MCP review gate for unpublished drafts.
|
|
16
|
+
|
|
17
|
+
When an authenticated LinkedIn feed/composer/browser screenshot is available,
|
|
18
|
+
that screenshot is the strongest evidence. Still record the fields below so
|
|
19
|
+
future agents can compare candidates without redoing the visual inspection.
|
|
20
|
+
|
|
21
|
+
Observed public LinkedIn post text style for feed-style post pages:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
selector basis: p.attributed-text-segment-list__content
|
|
25
|
+
font family: -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
|
|
26
|
+
"Fira Sans", Ubuntu, "Oxygen Sans", Cantarell, "Droid Sans",
|
|
27
|
+
"Lucida Grande", Helvetica, Arial, sans-serif
|
|
28
|
+
font size: 14px
|
|
29
|
+
line height: 21px
|
|
30
|
+
font weight: 400
|
|
31
|
+
letter spacing: normal
|
|
32
|
+
white space: pre-wrap
|
|
33
|
+
overflow wrap: break-word
|
|
34
|
+
text color: rgba(0, 0, 0, 0.9)
|
|
35
|
+
mobile text width: 308px
|
|
36
|
+
desktop text width: 582px
|
|
37
|
+
review clamp: first 3 rendered text lines
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
The `review clamp` is not an official LinkedIn rule. It is the conservative
|
|
41
|
+
apples-to-apples region create-post must use when comparing hooks. Do not let a
|
|
42
|
+
desktop pass rescue a mobile fail.
|
|
43
|
+
|
|
44
|
+
## Required Rendering Record
|
|
45
|
+
|
|
46
|
+
Every shortlisted source hook, adapted hook block, generated hook candidate, and
|
|
47
|
+
selected hook must include a `renderedPreview` record:
|
|
48
|
+
|
|
49
|
+
```text
|
|
50
|
+
renderedPreview:
|
|
51
|
+
basis: linkedin_css_contract | authenticated_linkedin_screenshot | manual_user_source
|
|
52
|
+
cssContractVersion: linkedin-preview-rendering/v1
|
|
53
|
+
mobile:
|
|
54
|
+
textWidthPx: 308
|
|
55
|
+
fontSizePx: 14
|
|
56
|
+
lineHeightPx: 21
|
|
57
|
+
visibleTextBlock: <literal first rendered review-clamp block>
|
|
58
|
+
renderedLines:
|
|
59
|
+
- <line 1 exactly as wrapped>
|
|
60
|
+
- <line 2 exactly as wrapped>
|
|
61
|
+
- <line 3 exactly as wrapped>
|
|
62
|
+
lineCountBeforeClamp: <number>
|
|
63
|
+
blankLinesBeforeClamp: <number>
|
|
64
|
+
corePainProofOrCuriosityVisible: true | false
|
|
65
|
+
corePointVisible: true | false
|
|
66
|
+
intentionalOpenLoop: true | false
|
|
67
|
+
specificClickQuestionVisible: true | false
|
|
68
|
+
payoffPlannedImmediatelyAfterClamp: true | false
|
|
69
|
+
seeMoreClickReason: <why a reader would click see more>
|
|
70
|
+
seeMoreRisk: pass | warn | fail
|
|
71
|
+
screenshotPath: <optional local path>
|
|
72
|
+
desktop:
|
|
73
|
+
textWidthPx: 582
|
|
74
|
+
fontSizePx: 14
|
|
75
|
+
lineHeightPx: 21
|
|
76
|
+
visibleTextBlock: <literal first rendered review-clamp block>
|
|
77
|
+
renderedLines:
|
|
78
|
+
- <line 1 exactly as wrapped>
|
|
79
|
+
- <line 2 exactly as wrapped>
|
|
80
|
+
- <line 3 exactly as wrapped>
|
|
81
|
+
lineCountBeforeClamp: <number>
|
|
82
|
+
blankLinesBeforeClamp: <number>
|
|
83
|
+
corePainProofOrCuriosityVisible: true | false
|
|
84
|
+
corePointVisible: true | false
|
|
85
|
+
seeMoreRisk: pass | warn | fail
|
|
86
|
+
screenshotPath: <optional local path>
|
|
87
|
+
diagnostics:
|
|
88
|
+
charCount: <number>
|
|
89
|
+
charCountIncludingNewlines: <number>
|
|
90
|
+
firstLineChars: <number>
|
|
91
|
+
firstTwoPhysicalLinesChars: <number>
|
|
92
|
+
longestNonblankLineChars: <number>
|
|
93
|
+
blankLineVisualRisk: none | low | medium | high
|
|
94
|
+
pointAfterMobileClamp: true | false
|
|
95
|
+
openLoopType: none | hidden_payoff | contradiction | proof_gap | workflow_reveal | asset_reveal | story_gap
|
|
96
|
+
rewriteIfTruncated: <short fallback>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
If a host cannot produce screenshots, it must still produce the literal wrapped
|
|
100
|
+
line blocks using the CSS contract. If it cannot produce either screenshots or
|
|
101
|
+
literal line wraps, return `blocked` or `needs_revision`; do not claim the hook
|
|
102
|
+
passed preview validation from character counts alone.
|
|
103
|
+
|
|
104
|
+
## Study Rules
|
|
105
|
+
|
|
106
|
+
For source-post research:
|
|
107
|
+
|
|
108
|
+
- Render the exact visible opening from full text when full text is available.
|
|
109
|
+
- If only a search preview is available, render only the preview text and set
|
|
110
|
+
`basis: manual_user_source` or record `sourceTextBasis: search_preview`.
|
|
111
|
+
- Lower confidence when the search preview is cut off or the body is
|
|
112
|
+
unavailable.
|
|
113
|
+
- Extract hook lessons from the rendered first-screen experience, not from the
|
|
114
|
+
full post in isolation.
|
|
115
|
+
|
|
116
|
+
For generated hooks:
|
|
117
|
+
|
|
118
|
+
- Generate the hook from the selected premise first.
|
|
119
|
+
- Render the hook for mobile and desktop before scoring it.
|
|
120
|
+
- Score the rendered first-screen click reason before scoring cleverness.
|
|
121
|
+
- If the goal is see-more clicks, the hook may intentionally hide the payoff
|
|
122
|
+
after the mobile clamp, but the visible block must create a specific question
|
|
123
|
+
the target reader wants answered.
|
|
124
|
+
- Rewrite any candidate whose real point appears after the mobile clamp unless
|
|
125
|
+
that point is the planned payoff for an intentional open loop.
|
|
126
|
+
|
|
127
|
+
## Pass, Warn, Fail
|
|
128
|
+
|
|
129
|
+
Use these rendered gates:
|
|
130
|
+
|
|
131
|
+
- `pass`: the mobile rendered preview shows the pain, proof, or curiosity by the
|
|
132
|
+
end of the first 3 rendered lines, and either the core point is
|
|
133
|
+
understandable without opening "see more" or an intentional open loop creates
|
|
134
|
+
a specific click question with an immediate planned payoff.
|
|
135
|
+
- `warn`: the mobile rendered preview creates useful curiosity but the core
|
|
136
|
+
point or click question is slightly softened by wrapping, blank-line rhythm,
|
|
137
|
+
or one missing context word. A compact fallback is required.
|
|
138
|
+
- `fail`: the hook's real point appears after the first 3 mobile rendered lines,
|
|
139
|
+
the visible open loop is vague, the first rendered line is generic setup,
|
|
140
|
+
blank lines consume the preview before the reader sees the point, or desktop
|
|
141
|
+
fit is the only reason it looks good.
|
|
142
|
+
|
|
143
|
+
A draft cannot be `ready` when the selected hook has:
|
|
144
|
+
|
|
145
|
+
- no `renderedPreview`
|
|
146
|
+
- `mobile.seeMoreRisk: fail`
|
|
147
|
+
- `mobile.corePainProofOrCuriosityVisible: false`
|
|
148
|
+
- `mobile.corePointVisible: false` unless `mobile.intentionalOpenLoop: true`,
|
|
149
|
+
`mobile.specificClickQuestionVisible: true`, and
|
|
150
|
+
`mobile.payoffPlannedImmediatelyAfterClamp: true`
|
|
151
|
+
- `pointAfterMobileClamp: true` unless the point after the clamp is the
|
|
152
|
+
intentional payoff for a specific open loop
|
|
153
|
+
|
|
154
|
+
## Report Format
|
|
155
|
+
|
|
156
|
+
Research reports must show rendered preview blocks for the best examples and
|
|
157
|
+
recommended draft directions:
|
|
158
|
+
|
|
159
|
+
```text
|
|
160
|
+
Rendered preview:
|
|
161
|
+
mobile:
|
|
162
|
+
<line 1>
|
|
163
|
+
<line 2>
|
|
164
|
+
<line 3>
|
|
165
|
+
|
|
166
|
+
desktop:
|
|
167
|
+
<line 1>
|
|
168
|
+
<line 2>
|
|
169
|
+
<line 3>
|
|
170
|
+
|
|
171
|
+
verdict: pass | warn | fail
|
|
172
|
+
why: <what is visible before the fold>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Do not say "it fits on mobile" without showing what the mobile reader actually
|
|
176
|
+
sees.
|
|
@@ -59,10 +59,17 @@ 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-adjusted score, and normalization confidence notes when reach
|
|
65
|
+
normalization was used
|
|
62
66
|
- full-text availability
|
|
63
67
|
- source hook preview measurements, including text basis, char count including
|
|
64
68
|
newlines, physical/content line counts, longest nonblank line, blank-line
|
|
65
69
|
visual risk, and mobile/desktop preview budget status
|
|
70
|
+
- rendered preview records for kept source hooks and adapted hook blocks,
|
|
71
|
+
including literal mobile/desktop preview blocks and whether the first-screen
|
|
72
|
+
promise is visible
|
|
66
73
|
- extracted hook patterns
|
|
67
74
|
- selected hook basis
|
|
68
75
|
|
|
@@ -81,8 +88,18 @@ Draft files must preserve:
|
|
|
81
88
|
- score fields for hook, proof, voice, specificity, skimmability, and publish confidence
|
|
82
89
|
- `verdict`: `baseline`, `keep`, `revise`, `reject`, `publish_candidate`, or a similarly explicit state
|
|
83
90
|
- draft body
|
|
91
|
+
- pre-draft narrative outline: hierarchical `I.`, `A.`, `i.` outline covering
|
|
92
|
+
hook debt, thesis, reader, core mechanism, definitions, proof claims,
|
|
93
|
+
working body patterns adapted, narrative beats, mobile scan path, body
|
|
94
|
+
promise, concrete examples, abstractions to remove, and draft risks
|
|
84
95
|
- validation receipt, including LinkedIn preview pass/warn/fail status and
|
|
85
96
|
compact fallback when the selected hook carries a warning
|
|
97
|
+
- visible flow trace when the user asked for whole-flow, debug, or step-by-step
|
|
98
|
+
mode, including checkpoint statuses, quality break, downstream effect, and
|
|
99
|
+
whether the trace was shown before saving
|
|
100
|
+
- rendered mobile and desktop preview blocks for the selected hook; drafts
|
|
101
|
+
cannot be ready when this rendered-preview audit is missing or fails mobile
|
|
102
|
+
visibility
|
|
86
103
|
- status: `draft`, `ready`, `needs_revision`, `published`, or `archived`
|
|
87
104
|
|
|
88
105
|
Multiple drafts for the same idea are expected. Keep the `ideaId` stable and
|