@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.
@@ -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 preview-basis:
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. Post Positioning Breakdowns
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
- 6. Viral-Post Outlines
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
- 7. Market Belief Map
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
- 8. Premise Cards
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
- 9. Source Template Selection
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
- 10. Hook Lab
405
+ 11. Hook Lab
396
406
  - at least 12 hooks:
397
- - rendered preview record or explicit preview-basis:
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
- 11. Pre-Draft Narrative Outline
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
- 12. Body Expression Lab
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
- 13. Draft
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
- 14. Validation And Save
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 this conservative mobile-first LinkedIn preview gate. LinkedIn does not
816
- publish exact "see more" cutoff rules, and rendering varies by device, app
817
- version, font, media, and line break. These are v1 safety budgets, not claims
818
- about an official LinkedIn limit:
819
-
820
- - `pass`: hook is <= 110 chars including newlines, every nonblank line is <= 45 chars, and the hook's core point lands before likely truncation.
821
- - `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.
822
- - `fail`: hook is > 140 chars including newlines, any nonblank line is > 55 chars, or the hook's point depends on text after likely truncation.
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 four outputs:
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. viral-post outlines: the narrative structure of each source post
15
- 4. post positioning breakdown templates: line-level positioning and narrative
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 these as
258
- conservative v1 planning budgets:
259
-
260
- - `pass`: opening hook is <= 110 chars including newlines, every nonblank line
261
- is <= 45 chars, and the hook's core point lands before likely truncation.
262
- - `warn`: opening hook is 111-140 chars including newlines, any nonblank line is
263
- 46-55 chars, or blank lines create visual-line risk. Blank lines are allowed,
264
- but they count as physical lines.
265
- - `fail`: opening hook is > 140 chars including newlines, any nonblank line is
266
- > 55 chars, or the hook's core point depends on text after likely truncation.
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. 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.
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 into a viral-post outline.
443
- The outline is the narrative skeleton beneath the exact words.
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 this contract
9
- or through a stricter authenticated LinkedIn screenshot.
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: linkedin_css_contract | authenticated_linkedin_screenshot | manual_user_source
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
- screenshotPath: <optional local path>
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
- screenshotPath: <optional local path>
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 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.
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 conservative LinkedIn
320
- preview budgets. LinkedIn does not publish exact "see more" cutoff rules, and
321
- rendering varies by device, app version, font, media, and line break. This audit
322
- is a mobile-first safety gate, not a claim about an official LinkedIn limit.
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`: hook is <= 110 chars including newlines, every nonblank line is <= 45 chars, and the hook's core point lands before likely truncation.
327
- - `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.
328
- - `fail`: hook is > 140 chars including newlines, any nonblank line is > 55 chars, or the hook's point depends on text after likely truncation.
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`. A draft may be `ready` with
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, and the receipt includes a compact fallback.
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. Working body pattern(s) being adapted:
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
- C. What gets borrowed:
318
+ D. What gets borrowed:
316
319
  i. <narrative job, sequence, transition, or proof order>
317
- D. What must not be copied:
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 body
348
- pattern and what beat order, proof order, or transition logic is being
349
- borrowed.
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.