@sellable/mcp 0.1.261 → 0.1.263
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/content-posts.d.ts +222 -1
- package/dist/tools/content-posts.js +504 -0
- package/dist/tools/registry.d.ts +33 -0
- package/package.json +1 -1
- package/skills/create-post/SKILL.md +58 -21
- package/skills/create-post/references/hook-research-playbook.md +93 -18
- package/skills/create-post/references/linkedin-preview-rendering.md +51 -10
- package/skills/create-post/references/post-file-contract.md +6 -0
- package/skills/create-post/references/post-validation.md +31 -9
- package/skills/create-post/references/premise-development.md +10 -6
|
@@ -108,6 +108,7 @@ Use these MCP tools when available:
|
|
|
108
108
|
- `mcp__sellable__get_post_idea`
|
|
109
109
|
- `mcp__sellable__list_post_ideas`
|
|
110
110
|
- `mcp__sellable__save_hook_research`
|
|
111
|
+
- `mcp__sellable__render_linkedin_post_preview`
|
|
111
112
|
- `mcp__sellable__save_post_draft`
|
|
112
113
|
- `mcp__sellable__update_post_draft`
|
|
113
114
|
- `mcp__sellable__list_post_draft_iterations`
|
|
@@ -342,21 +343,30 @@ Visible Flow Trace
|
|
|
342
343
|
|
|
343
344
|
4. Hook Autopsies
|
|
344
345
|
- source hook:
|
|
345
|
-
- rendered/mobile preview or
|
|
346
|
+
- rendered/mobile preview artifact from `render_linkedin_post_preview` or
|
|
347
|
+
authenticated LinkedIn screenshot:
|
|
346
348
|
- see-more tension:
|
|
347
349
|
- curiosity debt:
|
|
348
350
|
- body promise:
|
|
349
351
|
- why it works:
|
|
350
352
|
- why it may not transfer:
|
|
351
353
|
|
|
352
|
-
5.
|
|
354
|
+
5. Source Message Outlines
|
|
355
|
+
- source:
|
|
356
|
+
- outline basis:
|
|
357
|
+
- source paragraph order:
|
|
358
|
+
- branches by paragraph/line/phrase:
|
|
359
|
+
- high-level goal of each branch:
|
|
360
|
+
- reusable move without copying wording:
|
|
361
|
+
|
|
362
|
+
6. Post Positioning Breakdowns
|
|
353
363
|
- source:
|
|
354
364
|
- positioning sequence:
|
|
355
365
|
- line-level narrative techniques:
|
|
356
366
|
- reusable template lines:
|
|
357
367
|
- adaptation guards:
|
|
358
368
|
|
|
359
|
-
|
|
369
|
+
7. Viral-Post Outlines
|
|
360
370
|
- source template:
|
|
361
371
|
- hook job:
|
|
362
372
|
- see-more trigger:
|
|
@@ -364,7 +374,7 @@ Visible Flow Trace
|
|
|
364
374
|
- body payoff:
|
|
365
375
|
- close job:
|
|
366
376
|
|
|
367
|
-
|
|
377
|
+
8. Market Belief Map
|
|
368
378
|
- resonating ideas:
|
|
369
379
|
- implicit beliefs:
|
|
370
380
|
- wants / resentments / fears:
|
|
@@ -372,7 +382,7 @@ Visible Flow Trace
|
|
|
372
382
|
- why this user can credibly say it:
|
|
373
383
|
- what not to claim:
|
|
374
384
|
|
|
375
|
-
|
|
385
|
+
9. Premise Cards
|
|
376
386
|
- 3-5 cards:
|
|
377
387
|
- story/scene:
|
|
378
388
|
- tension:
|
|
@@ -383,7 +393,7 @@ Visible Flow Trace
|
|
|
383
393
|
- score:
|
|
384
394
|
- selected premise:
|
|
385
395
|
|
|
386
|
-
|
|
396
|
+
10. Source Template Selection
|
|
387
397
|
- selected template:
|
|
388
398
|
- positioning sequence to borrow:
|
|
389
399
|
- hook move to borrow:
|
|
@@ -392,15 +402,15 @@ Visible Flow Trace
|
|
|
392
402
|
- forbidden borrowing:
|
|
393
403
|
- no-template rationale if rejected:
|
|
394
404
|
|
|
395
|
-
|
|
405
|
+
11. Hook Lab
|
|
396
406
|
- at least 12 hooks:
|
|
397
|
-
- rendered preview
|
|
407
|
+
- rendered preview artifact from `render_linkedin_post_preview`:
|
|
398
408
|
- hook-to-body promise:
|
|
399
409
|
- score:
|
|
400
410
|
- selected hook:
|
|
401
411
|
- rejected winning-looking hooks and why:
|
|
402
412
|
|
|
403
|
-
|
|
413
|
+
12. Pre-Draft Narrative Outline
|
|
404
414
|
- hierarchical outline shown before draft:
|
|
405
415
|
- I. hook and click debt:
|
|
406
416
|
- II. thesis the post will defend:
|
|
@@ -410,7 +420,7 @@ Visible Flow Trace
|
|
|
410
420
|
- VI. scan path and proof safety:
|
|
411
421
|
- user corrections applied before prose:
|
|
412
422
|
|
|
413
|
-
|
|
423
|
+
13. Body Expression Lab
|
|
414
424
|
- 5-8 body-expression candidates:
|
|
415
425
|
- best lines:
|
|
416
426
|
- weak lines:
|
|
@@ -419,13 +429,13 @@ Visible Flow Trace
|
|
|
419
429
|
- score:
|
|
420
430
|
- combined body plan:
|
|
421
431
|
|
|
422
|
-
|
|
432
|
+
14. Draft
|
|
423
433
|
- draft body:
|
|
424
434
|
- lines intentionally copied from user source:
|
|
425
435
|
- outside-source wording copied: yes/no:
|
|
426
436
|
- known weak lines:
|
|
427
437
|
|
|
428
|
-
|
|
438
|
+
15. Validation And Save
|
|
429
439
|
- ready status:
|
|
430
440
|
- proof gate:
|
|
431
441
|
- voice gate:
|
|
@@ -619,6 +629,15 @@ Post positioning breakdown templates:
|
|
|
619
629
|
- reusable template lines:
|
|
620
630
|
- Sellable adaptation:
|
|
621
631
|
|
|
632
|
+
Source message outlines:
|
|
633
|
+
1. source + outline basis
|
|
634
|
+
- source paragraph order:
|
|
635
|
+
- paragraph/line/phrase branches:
|
|
636
|
+
- high-level goal of each branch:
|
|
637
|
+
- reader effect:
|
|
638
|
+
- reusable move:
|
|
639
|
+
- adaptation guard:
|
|
640
|
+
|
|
622
641
|
Viral-post outlines:
|
|
623
642
|
1. outline name
|
|
624
643
|
- hook job:
|
|
@@ -812,17 +831,34 @@ Each hook must include:
|
|
|
812
831
|
|
|
813
832
|
Do not copy source wording. Copy only the structure.
|
|
814
833
|
|
|
815
|
-
Use
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
834
|
+
Use the rendered-preview contract from
|
|
835
|
+
`references/linkedin-preview-rendering.md`. LinkedIn does not publish exact
|
|
836
|
+
"see more" cutoff rules, and rendering varies by device, app version, font,
|
|
837
|
+
media, and line break. Treat character counts as diagnostics only, not as proof
|
|
838
|
+
that the hook will render before "see more."
|
|
839
|
+
|
|
840
|
+
The selected hook and top candidates must include literal mobile and desktop
|
|
841
|
+
visible blocks. Current third-party preview tools and 2026 creator references
|
|
842
|
+
generally cluster around mobile showing about 2-3 text lines and desktop showing
|
|
843
|
+
about 3-4 text lines before "see more," with media attachments sometimes showing
|
|
844
|
+
less. Blank lines and `--` separators consume visible preview lines.
|
|
845
|
+
|
|
846
|
+
Use:
|
|
847
|
+
|
|
848
|
+
- `pass`: rendered mobile preview shows the pain, proof, or curiosity by the end
|
|
849
|
+
of the first 3 rendered lines, and either the core point is visible or a
|
|
850
|
+
specific intentional open loop is visible with immediate body payoff planned
|
|
851
|
+
- `warn`: rendered mobile preview creates useful curiosity but wrapping,
|
|
852
|
+
blank-line rhythm, media risk, or one missing context word weakens it; include
|
|
853
|
+
a compact fallback
|
|
854
|
+
- `fail`: the hook's real point appears after the rendered mobile review clamp,
|
|
855
|
+
the visible open loop is vague, blank lines consume the preview before the
|
|
856
|
+
point, or desktop fit is the only reason it looks good
|
|
823
857
|
|
|
824
858
|
Desktop preview usually has more room. Still record `desktopPreviewFit`, but
|
|
825
|
-
never let desktop fit compensate for a mobile `fail`.
|
|
859
|
+
never let desktop fit compensate for a mobile `fail`. Do not tell the user "we
|
|
860
|
+
know" how LinkedIn will render unless there is an authenticated LinkedIn
|
|
861
|
+
screenshot; say it passes the renderer and show the visible blocks.
|
|
826
862
|
|
|
827
863
|
If a hook's point depends on text after the likely preview, rewrite it before
|
|
828
864
|
selecting it. A selected hook may carry a `warn` only when the warning is about
|
|
@@ -839,6 +875,7 @@ Draft from:
|
|
|
839
875
|
- approved or latest `Pre-Draft Narrative Outline`
|
|
840
876
|
- hook research artifact
|
|
841
877
|
- selected source template or no-template rationale
|
|
878
|
+
- source-message outline for any outside post being adapted
|
|
842
879
|
- viral-post outline
|
|
843
880
|
- post positioning breakdown template
|
|
844
881
|
- body expression candidates and combined body plan
|
|
@@ -7,12 +7,14 @@ readers click "see more," decompose each post into a reusable narrative and
|
|
|
7
7
|
positioning template, and then adapt those templates to the user's real story
|
|
8
8
|
without copying source wording.
|
|
9
9
|
|
|
10
|
-
V2 research has
|
|
10
|
+
V2 research has five outputs:
|
|
11
11
|
|
|
12
12
|
1. weighted source winners: the best recent posts to learn from
|
|
13
13
|
2. hook autopsies: exact preview measurements, open loops, and tension created
|
|
14
|
-
3.
|
|
15
|
-
|
|
14
|
+
3. source-message outlines: the paragraph/line/phrase structure of each source
|
|
15
|
+
post in its original order
|
|
16
|
+
4. viral-post outlines: the reusable narrative structure of each source post
|
|
17
|
+
5. post positioning breakdown templates: line-level positioning and narrative
|
|
16
18
|
technique maps that can be adapted into the user's draft
|
|
17
19
|
|
|
18
20
|
## Search Inputs
|
|
@@ -254,19 +256,33 @@ Measure the visible opening for every shortlisted source post before extracting
|
|
|
254
256
|
the hook pattern. This makes the study useful for LinkedIn, not just generally
|
|
255
257
|
"good writing."
|
|
256
258
|
|
|
257
|
-
LinkedIn does not publish exact "see more" cutoff rules. Treat
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
-
|
|
266
|
-
|
|
259
|
+
LinkedIn does not publish exact "see more" cutoff rules. Treat preview fit as a
|
|
260
|
+
rendered-line problem first, not a fixed character-count rule. Current
|
|
261
|
+
third-party preview tools and 2026 creator references generally cluster around:
|
|
262
|
+
|
|
263
|
+
- mobile feed: about 2-3 visible text lines, often around 140 characters when
|
|
264
|
+
there is no media
|
|
265
|
+
- desktop feed: about 3-4 visible text lines, often around 210 characters when
|
|
266
|
+
there is no media
|
|
267
|
+
- media posts can show fewer text lines before truncation
|
|
268
|
+
- blank lines and `--` style separators consume visible preview lines
|
|
269
|
+
|
|
270
|
+
Use `references/linkedin-preview-rendering.md` as the required gate. Character
|
|
271
|
+
budgets are diagnostics only:
|
|
272
|
+
|
|
273
|
+
- `pass`: rendered mobile preview shows the pain, proof, or curiosity by the end
|
|
274
|
+
of the first 3 rendered lines, and the hook creates a specific click reason
|
|
275
|
+
- `warn`: rendered mobile preview creates useful curiosity but loses one useful
|
|
276
|
+
context word, wraps awkwardly, or spends a visible line on blank space or a
|
|
277
|
+
separator; include a compact fallback
|
|
278
|
+
- `fail`: the hook's real point appears after the rendered mobile review clamp,
|
|
279
|
+
the visible open loop is vague, blank lines consume the preview before the
|
|
280
|
+
point, or desktop fit is the only reason it looks good
|
|
267
281
|
|
|
268
282
|
Desktop preview has more room, so record it separately, but never let desktop
|
|
269
|
-
fit compensate for a mobile `fail`.
|
|
283
|
+
fit compensate for a mobile `fail`. Never say "we know" how LinkedIn will render
|
|
284
|
+
the hook unless there is an authenticated LinkedIn screenshot. Say the hook
|
|
285
|
+
`passes the renderer` and show the mobile/desktop visible blocks.
|
|
270
286
|
|
|
271
287
|
For each source, record:
|
|
272
288
|
|
|
@@ -280,6 +296,8 @@ For each source, record:
|
|
|
280
296
|
- `firstTwoContentLinesChars`
|
|
281
297
|
- `longestNonblankLineChars`
|
|
282
298
|
- `blankLineCountBeforeFold`
|
|
299
|
+
- `renderedPreview`: literal mobile and desktop visible blocks from
|
|
300
|
+
`references/linkedin-preview-rendering.md`
|
|
283
301
|
- `mobilePreviewBudget`: `pass`, `warn`, or `fail`
|
|
284
302
|
- `desktopPreviewBudget`: `pass`, `warn`, or `fail`
|
|
285
303
|
- `blankLineVisualRisk`
|
|
@@ -434,13 +452,70 @@ line_map:
|
|
|
434
452
|
```
|
|
435
453
|
|
|
436
454
|
Break long lines into phrase-level segments when one line contains multiple
|
|
437
|
-
jobs.
|
|
438
|
-
|
|
455
|
+
jobs. Use short anchors or paraphrased line labels for outside source posts; do
|
|
456
|
+
not reproduce the full outside post. Never copy source wording into the draft
|
|
457
|
+
unless it is the user's own approved post.
|
|
458
|
+
|
|
459
|
+
## Source Message Outline
|
|
460
|
+
|
|
461
|
+
Before converting a source post into a reusable template, outline the source
|
|
462
|
+
message as it is. This is the branch map of the original post, not the adapted
|
|
463
|
+
draft plan.
|
|
464
|
+
|
|
465
|
+
The outline must preserve the source post's order and branch each paragraph,
|
|
466
|
+
line, or phrase into the high-level rhetorical goal it serves. If a paragraph
|
|
467
|
+
contains several jobs, split it into phrase-level branches.
|
|
468
|
+
|
|
469
|
+
Use this format:
|
|
470
|
+
|
|
471
|
+
```text
|
|
472
|
+
Source Message Outline:
|
|
473
|
+
source: <author + URL>
|
|
474
|
+
outline_basis: full_text | excerpt_only | screenshot | user_supplied_text
|
|
475
|
+
copyright_safety: use short anchors/paraphrases; do not reproduce the full source
|
|
476
|
+
|
|
477
|
+
P1. <short paragraph anchor or paraphrase>
|
|
478
|
+
goal: <what this paragraph makes the reader think/feel/wonder>
|
|
479
|
+
why_here: <why it appears at this point in the sequence>
|
|
480
|
+
branches:
|
|
481
|
+
A. <phrase/line anchor or paraphrase>
|
|
482
|
+
job: <high-level job of this phrase/line>
|
|
483
|
+
reader_effect: <what changes in the reader>
|
|
484
|
+
reusable_move: <what can be adapted without copying wording>
|
|
485
|
+
B. <phrase/line anchor or paraphrase>
|
|
486
|
+
job:
|
|
487
|
+
reader_effect:
|
|
488
|
+
reusable_move:
|
|
489
|
+
|
|
490
|
+
P2. <short paragraph anchor or paraphrase>
|
|
491
|
+
goal:
|
|
492
|
+
why_here:
|
|
493
|
+
branches:
|
|
494
|
+
A.
|
|
495
|
+
job:
|
|
496
|
+
reader_effect:
|
|
497
|
+
reusable_move:
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
Quality rules:
|
|
501
|
+
|
|
502
|
+
- Do not summarize the whole post first and then invent a cleaner outline.
|
|
503
|
+
- Do not skip ordinary body paragraphs; the point is to learn the source's real
|
|
504
|
+
sequence, including setup, repetition, proof, turns, and close.
|
|
505
|
+
- Every branch must answer: "What is this exact line/paragraph/phrase doing?"
|
|
506
|
+
- Use `P1`, `P2`, `A`, `B`, and `i` structure so the user can compare it
|
|
507
|
+
against the source post.
|
|
508
|
+
- If only an excerpt is available, label `outline_basis: excerpt_only` and do
|
|
509
|
+
not infer hidden body structure.
|
|
510
|
+
- After the source-message outline, then create the viral-post outline and
|
|
511
|
+
template. The adapted outline cannot replace the source-message outline.
|
|
439
512
|
|
|
440
513
|
## Viral-Post Outline
|
|
441
514
|
|
|
442
|
-
After the line-level breakdown, convert each keeper
|
|
443
|
-
|
|
515
|
+
After the source-message outline and line-level breakdown, convert each keeper
|
|
516
|
+
into a viral-post outline. The viral-post outline is the reusable narrative
|
|
517
|
+
skeleton beneath the exact words, not a replacement for the source-message
|
|
518
|
+
outline.
|
|
444
519
|
|
|
445
520
|
Use this format:
|
|
446
521
|
|
|
@@ -5,8 +5,14 @@ research, hook candidate generation, gold-standard decomposition, and draft
|
|
|
5
5
|
validation.
|
|
6
6
|
|
|
7
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
|
|
9
|
-
or through a stricter
|
|
8
|
+
not studied, selected, or ready until it has been rendered through
|
|
9
|
+
`mcp__sellable__render_linkedin_post_preview` or through a stricter
|
|
10
|
+
authenticated LinkedIn screenshot.
|
|
11
|
+
|
|
12
|
+
Do not let the LLM imagine wrapping. Character counts and hand-written line
|
|
13
|
+
blocks are only fallback diagnostics. The normal path is tool-rendered mobile
|
|
14
|
+
and desktop artifacts: HTML always, and PNG screenshots whenever local Chrome is
|
|
15
|
+
available.
|
|
10
16
|
|
|
11
17
|
## Rendering Basis
|
|
12
18
|
|
|
@@ -14,6 +20,38 @@ LinkedIn does not publish exact feed truncation rules, and rendering can vary by
|
|
|
14
20
|
surface, app version, device, media attachment, and account state. Use this
|
|
15
21
|
deterministic renderer as the MCP review gate for unpublished drafts.
|
|
16
22
|
|
|
23
|
+
Call:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
mcp__sellable__render_linkedin_post_preview({
|
|
27
|
+
"postText": "<full post text or candidate hook block>",
|
|
28
|
+
"sourceLabel": "<draft id, hook id, or source label>",
|
|
29
|
+
"renderScreenshots": true
|
|
30
|
+
})
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
When screenshots are produced, the PNG files are the review artifact. When
|
|
34
|
+
screenshots cannot be produced, the HTML artifact is still deterministic and
|
|
35
|
+
must be opened or explicitly marked as lower confidence.
|
|
36
|
+
|
|
37
|
+
Treat "see more" as a rendered-line problem first and a character-count problem
|
|
38
|
+
second. Current third-party preview tools and 2026 creator references generally
|
|
39
|
+
cluster around these working assumptions:
|
|
40
|
+
|
|
41
|
+
- mobile feed: about 2-3 visible text lines, often around 140 characters when
|
|
42
|
+
there is no media
|
|
43
|
+
- desktop feed: about 3-4 visible text lines, often around 210 characters when
|
|
44
|
+
there is no media
|
|
45
|
+
- posts with media may show fewer text lines before truncation, sometimes only
|
|
46
|
+
1-2 lines
|
|
47
|
+
- blank lines and intentional separators consume visible preview lines
|
|
48
|
+
- device width, font scaling, app version, browser, and profile/page context can
|
|
49
|
+
move the cutoff
|
|
50
|
+
|
|
51
|
+
Because of that variation, never say a hook is guaranteed to render before
|
|
52
|
+
"see more." Say `pass`, `warn`, or `fail` under the rendered-preview contract,
|
|
53
|
+
and show the visible mobile and desktop blocks.
|
|
54
|
+
|
|
17
55
|
When an authenticated LinkedIn feed/composer/browser screenshot is available,
|
|
18
56
|
that screenshot is the strongest evidence. Still record the fields below so
|
|
19
57
|
future agents can compare candidates without redoing the visual inspection.
|
|
@@ -48,13 +86,13 @@ selected hook must include a `renderedPreview` record:
|
|
|
48
86
|
|
|
49
87
|
```text
|
|
50
88
|
renderedPreview:
|
|
51
|
-
basis:
|
|
89
|
+
basis: local_chrome_headless_screenshot | linkedin_css_contract_html | authenticated_linkedin_screenshot | manual_user_source
|
|
52
90
|
cssContractVersion: linkedin-preview-rendering/v1
|
|
53
91
|
mobile:
|
|
54
92
|
textWidthPx: 308
|
|
55
93
|
fontSizePx: 14
|
|
56
94
|
lineHeightPx: 21
|
|
57
|
-
visibleTextBlock: <literal first rendered review-clamp block>
|
|
95
|
+
visibleTextBlock: <literal first rendered review-clamp block or tool estimated block when screenshot is the authority>
|
|
58
96
|
renderedLines:
|
|
59
97
|
- <line 1 exactly as wrapped>
|
|
60
98
|
- <line 2 exactly as wrapped>
|
|
@@ -68,7 +106,8 @@ renderedPreview:
|
|
|
68
106
|
payoffPlannedImmediatelyAfterClamp: true | false
|
|
69
107
|
seeMoreClickReason: <why a reader would click see more>
|
|
70
108
|
seeMoreRisk: pass | warn | fail
|
|
71
|
-
|
|
109
|
+
htmlPath: <local path>
|
|
110
|
+
screenshotPath: <local path when Chrome rendered PNG>
|
|
72
111
|
desktop:
|
|
73
112
|
textWidthPx: 582
|
|
74
113
|
fontSizePx: 14
|
|
@@ -83,7 +122,8 @@ renderedPreview:
|
|
|
83
122
|
corePainProofOrCuriosityVisible: true | false
|
|
84
123
|
corePointVisible: true | false
|
|
85
124
|
seeMoreRisk: pass | warn | fail
|
|
86
|
-
|
|
125
|
+
htmlPath: <local path>
|
|
126
|
+
screenshotPath: <local path when Chrome rendered PNG>
|
|
87
127
|
diagnostics:
|
|
88
128
|
charCount: <number>
|
|
89
129
|
charCountIncludingNewlines: <number>
|
|
@@ -96,10 +136,11 @@ renderedPreview:
|
|
|
96
136
|
rewriteIfTruncated: <short fallback>
|
|
97
137
|
```
|
|
98
138
|
|
|
99
|
-
If a host cannot produce screenshots, it must still produce
|
|
100
|
-
|
|
101
|
-
literal line
|
|
102
|
-
passed preview validation from character
|
|
139
|
+
If a host cannot produce screenshots, it must still produce and preserve the
|
|
140
|
+
HTML artifacts from `render_linkedin_post_preview`. If it cannot produce
|
|
141
|
+
screenshots, HTML artifacts, or literal wrapped line blocks, return `blocked` or
|
|
142
|
+
`needs_revision`; do not claim the hook passed preview validation from character
|
|
143
|
+
counts alone.
|
|
103
144
|
|
|
104
145
|
## Study Rules
|
|
105
146
|
|
|
@@ -70,6 +70,10 @@ Hook research files must preserve:
|
|
|
70
70
|
- rendered preview records for kept source hooks and adapted hook blocks,
|
|
71
71
|
including literal mobile/desktop preview blocks and whether the first-screen
|
|
72
72
|
promise is visible
|
|
73
|
+
- source-message outlines for keeper posts, preserving source paragraph order
|
|
74
|
+
and branching each paragraph, line, or phrase into high-level goal, reader
|
|
75
|
+
effect, reusable move, and adaptation guard without reproducing the full
|
|
76
|
+
outside source post
|
|
73
77
|
- extracted hook patterns
|
|
74
78
|
- selected hook basis
|
|
75
79
|
|
|
@@ -88,6 +92,8 @@ Draft files must preserve:
|
|
|
88
92
|
- score fields for hook, proof, voice, specificity, skimmability, and publish confidence
|
|
89
93
|
- `verdict`: `baseline`, `keep`, `revise`, `reject`, `publish_candidate`, or a similarly explicit state
|
|
90
94
|
- draft body
|
|
95
|
+
- source-message outline for any outside post being adapted, when the draft's
|
|
96
|
+
body shape was learned from a specific source post
|
|
91
97
|
- pre-draft narrative outline: hierarchical `I.`, `A.`, `i.` outline covering
|
|
92
98
|
hook debt, thesis, reader, core mechanism, definitions, proof claims,
|
|
93
99
|
working body patterns adapted, narrative beats, mobile scan path, body
|
|
@@ -11,6 +11,7 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
|
|
|
11
11
|
- `candidateHooksConsidered`
|
|
12
12
|
- `selectedHook`
|
|
13
13
|
- `selectedHookWhy`
|
|
14
|
+
- `sourceMessageOutline`
|
|
14
15
|
- `preDraftNarrativeOutline`
|
|
15
16
|
- `preDraftStructureBrief` as a legacy compatibility alias when older drafts or
|
|
16
17
|
downstream readers still expect it
|
|
@@ -170,6 +171,9 @@ Record:
|
|
|
170
171
|
- `readerValue`: what the reader learns, sees differently, or can do
|
|
171
172
|
- `proofAvailable`: source-backed proof used
|
|
172
173
|
- `proofMissing`: claims intentionally avoided or requiring user input
|
|
174
|
+
- `sourceMessageOutline`: source post decomposition in original order, with
|
|
175
|
+
paragraph/line/phrase branches, high-level goal of each branch, reader effect,
|
|
176
|
+
reusable move, and adaptation guard
|
|
173
177
|
- `preDraftNarrativeOutline`: hierarchical `I.`, `A.`, `i.` outline showing
|
|
174
178
|
hook debt, thesis, operating model, working body patterns adapted, narrative
|
|
175
179
|
beats, scan path, proof claims, and abstractions to remove
|
|
@@ -316,22 +320,38 @@ proof from another creator, save as `needs_revision`.
|
|
|
316
320
|
|
|
317
321
|
## LinkedIn Preview Audit
|
|
318
322
|
|
|
319
|
-
Audit the selected hook and top candidates against
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
is a mobile-first safety gate, not a claim about an
|
|
323
|
+
Audit the selected hook and top candidates against the rendered-preview
|
|
324
|
+
contract. LinkedIn does not publish exact "see more" cutoff rules, and rendering
|
|
325
|
+
varies by device, app version, font, media, line break, and whether the post has
|
|
326
|
+
media attached. This audit is a mobile-first safety gate, not a claim about an
|
|
327
|
+
official LinkedIn limit.
|
|
328
|
+
|
|
329
|
+
Treat character counts as diagnostics only. The gate is the literal rendered
|
|
330
|
+
mobile and desktop visible block from `references/linkedin-preview-rendering.md`
|
|
331
|
+
or an authenticated LinkedIn screenshot.
|
|
323
332
|
|
|
324
333
|
Use:
|
|
325
334
|
|
|
326
|
-
- `pass`:
|
|
327
|
-
|
|
328
|
-
|
|
335
|
+
- `pass`: the rendered mobile preview shows the pain, proof, or curiosity by the
|
|
336
|
+
end of the first 3 rendered lines, and either the core point is visible or a
|
|
337
|
+
specific intentional open loop is visible with immediate body payoff planned
|
|
338
|
+
- `warn`: the rendered mobile preview creates useful curiosity but wrapping,
|
|
339
|
+
blank-line rhythm, media risk, or one missing context word weakens it; include
|
|
340
|
+
a compact fallback
|
|
341
|
+
- `fail`: the hook's real point appears after the rendered mobile review clamp,
|
|
342
|
+
the visible open loop is vague, blank lines consume the preview before the
|
|
343
|
+
point, or desktop fit is the only reason it looks good
|
|
329
344
|
|
|
330
345
|
Desktop preview usually has more room. Still record desktop fit, but never let
|
|
331
346
|
desktop fit compensate for a mobile `fail`.
|
|
332
347
|
|
|
333
348
|
Record:
|
|
334
349
|
|
|
350
|
+
- `renderedPreview`
|
|
351
|
+
- `renderedPreviewBasis`: `linkedin_css_contract` |
|
|
352
|
+
`authenticated_linkedin_screenshot` | `manual_user_source`
|
|
353
|
+
- literal mobile visible block
|
|
354
|
+
- literal desktop visible block
|
|
335
355
|
- `charCount`
|
|
336
356
|
- `charCountIncludingNewlines`
|
|
337
357
|
- `firstLineChars`
|
|
@@ -351,9 +371,11 @@ Record:
|
|
|
351
371
|
- `compactFallback` when `previewBudgetStatus` is `warn`
|
|
352
372
|
|
|
353
373
|
If the hook only works after likely truncation, rewrite it. A draft cannot be
|
|
354
|
-
`ready` with `previewBudgetStatus: fail
|
|
374
|
+
`ready` with `previewBudgetStatus: fail`, with no rendered preview block, or
|
|
375
|
+
with only a character-count claim. A draft may be `ready` with
|
|
355
376
|
`previewBudgetStatus: warn` only when the warning is explicit, usually because
|
|
356
|
-
the user prefers blank-line rhythm,
|
|
377
|
+
the user prefers blank-line rhythm, separators, or a deliberate open loop, and
|
|
378
|
+
the receipt includes a compact fallback.
|
|
357
379
|
|
|
358
380
|
## Simplifier / Concrete-Language Audit
|
|
359
381
|
|
|
@@ -309,12 +309,15 @@ III. Operating model
|
|
|
309
309
|
|
|
310
310
|
IV. Body shape borrowed from posts that worked
|
|
311
311
|
A. Selected source template or no-template rationale: <source or rationale>
|
|
312
|
-
B.
|
|
312
|
+
B. Source-message outline being adapted:
|
|
313
|
+
i. <source post + P1/P2/P3 branch sequence from the original message>
|
|
314
|
+
ii. <which original paragraph/line/phrase jobs matter most>
|
|
315
|
+
C. Working body pattern(s) being adapted:
|
|
313
316
|
i. <pattern name>: <beat order and why it works>
|
|
314
317
|
ii. <pattern name>: <beat order and why it works>
|
|
315
|
-
|
|
318
|
+
D. What gets borrowed:
|
|
316
319
|
i. <narrative job, sequence, transition, or proof order>
|
|
317
|
-
|
|
320
|
+
E. What must not be copied:
|
|
318
321
|
i. <source wording, creator-specific proof, joke, or context>
|
|
319
322
|
|
|
320
323
|
V. Narrative beats
|
|
@@ -344,9 +347,10 @@ Quality gate:
|
|
|
344
347
|
- The outline must include proof claims and risk before prose.
|
|
345
348
|
- The outline must define any operating terms that could be misunderstood.
|
|
346
349
|
- The outline must use `I.`, `A.`, and `i.` hierarchy. A flat field list fails.
|
|
347
|
-
- If the post is adapting bodies that worked, the outline must name the
|
|
348
|
-
|
|
349
|
-
|
|
350
|
+
- If the post is adapting bodies that worked, the outline must name the source
|
|
351
|
+
message outline being adapted and the body pattern, including which original
|
|
352
|
+
paragraph/line/phrase jobs transfer and what beat order, proof order, or
|
|
353
|
+
transition logic is being borrowed.
|
|
350
354
|
- If the post is a field guide, the narrative beats must show the hierarchy
|
|
351
355
|
before prose, such as best-to-worst, highest-to-lowest intent, or
|
|
352
356
|
source-to-outcome.
|