@sellable/mcp 0.1.269 → 0.1.272

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.
@@ -0,0 +1,221 @@
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 its visible mobile and desktop blocks come
9
+ from `mcp__sellable__calculate_linkedin_hook_preview` or from a stricter
10
+ authenticated LinkedIn screenshot.
11
+
12
+ Do not let the LLM imagine wrapping. The normal path is a function call that
13
+ returns rendered mobile and desktop lines. HTML and PNG outputs from
14
+ `mcp__sellable__render_linkedin_post_preview` are optional visual QA artifacts,
15
+ not the primary interface.
16
+
17
+ ## Rendering Basis
18
+
19
+ LinkedIn does not publish exact feed truncation rules, and rendering can vary by
20
+ surface, app version, device, media attachment, and account state. Use this
21
+ deterministic function as the MCP review gate for unpublished drafts.
22
+
23
+ Simple operating policy: judge the hook by the first 3 rendered lines. Use ~140
24
+ characters on mobile and ~210 characters on desktop as guardrails only. If the
25
+ 3-line preview and the character guardrail disagree, trust the rendered lines.
26
+
27
+ Call:
28
+
29
+ ```json
30
+ mcp__sellable__calculate_linkedin_hook_preview({
31
+ "postText": "<full post text or candidate hook block>",
32
+ "sourceLabel": "<draft id, hook id, or source label>",
33
+ "measurementMode": "browser"
34
+ })
35
+ ```
36
+
37
+ When local Chrome is available, browser measurement is the preferred functional
38
+ basis because it asks the browser layout engine to wrap the text under the
39
+ contract. When Chrome is unavailable, the tool falls back to the deterministic
40
+ width model and must mark that basis.
41
+
42
+ Treat "see more" as a rendered-line problem first and a character-count problem
43
+ second. Observed LinkedIn screenshots show the current desktop feed behaving
44
+ like a first-3-rendered-lines clamp: a first line, a blank line, and a third
45
+ line can be all that appears before `... more`.
46
+
47
+ - review gate: first 3 rendered visual lines
48
+ - mobile feed: tighter because the text column is narrower
49
+ - desktop feed: more characters can fit per line, but still review line count
50
+ - posts with media may show fewer text lines before truncation
51
+ - blank lines and intentional separators consume visible preview lines
52
+ - device width, font scaling, app version, browser, and profile/page context can
53
+ move the cutoff
54
+
55
+ Because of that variation, never say a hook is guaranteed to render before
56
+ "see more." Say `pass`, `warn`, or `fail` under the rendered-preview contract,
57
+ and show the visible mobile and desktop blocks.
58
+
59
+ When an authenticated LinkedIn feed/composer/browser screenshot is available,
60
+ that screenshot is the strongest evidence. Still record the fields below so
61
+ future agents can compare candidates without redoing the visual inspection.
62
+
63
+ Observed public LinkedIn post text style for feed-style post pages:
64
+
65
+ ```text
66
+ selector basis: p.attributed-text-segment-list__content
67
+ font family: -apple-system, system-ui, "Segoe UI", Roboto, "Helvetica Neue",
68
+ "Fira Sans", Ubuntu, "Oxygen Sans", Cantarell, "Droid Sans",
69
+ "Lucida Grande", Helvetica, Arial, sans-serif
70
+ font size: 14px
71
+ line height: 21px
72
+ font weight: 400
73
+ letter spacing: normal
74
+ white space: pre-wrap
75
+ overflow wrap: break-word
76
+ text color: rgba(0, 0, 0, 0.9)
77
+ mobile text width: 308px
78
+ desktop text width: 582px
79
+ review clamp: first 3 rendered text lines
80
+ ```
81
+
82
+ The `review clamp` is not an official LinkedIn rule. It is the conservative
83
+ apples-to-apples region create-post must use when comparing hooks. Do not let a
84
+ desktop pass rescue a mobile fail.
85
+
86
+ ## Required Rendering Record
87
+
88
+ Every shortlisted source hook, adapted hook block, generated hook candidate, and
89
+ selected hook must include a `renderedPreview` record:
90
+
91
+ ```text
92
+ renderedPreview:
93
+ basis: linkedin_rendering_rule_function | authenticated_linkedin_screenshot | manual_user_source
94
+ cssContractVersion: linkedin-preview-rendering/v2
95
+ mobile:
96
+ textWidthPx: 308
97
+ fontSizePx: 14
98
+ lineHeightPx: 21
99
+ clampLines: 3
100
+ charGuardrail: 140
101
+ measurementBasis: local_chrome_browser_layout | estimated_width_model
102
+ visibleTextBlock: <literal first 3 rendered lines>
103
+ renderedLines:
104
+ - <line 1 exactly as wrapped>
105
+ - <line 2 exactly as wrapped>
106
+ - <line 3 exactly as wrapped>
107
+ lineCountBeforeClamp: <number>
108
+ blankLinesBeforeClamp: <number>
109
+ corePainProofOrCuriosityVisible: true | false
110
+ corePointVisible: true | false
111
+ intentionalOpenLoop: true | false
112
+ specificClickQuestionVisible: true | false
113
+ payoffPlannedImmediatelyAfterClamp: true | false
114
+ seeMoreClickReason: <why a reader would click see more>
115
+ seeMoreRisk: pass | warn | fail
116
+ desktop:
117
+ textWidthPx: 582
118
+ fontSizePx: 14
119
+ lineHeightPx: 21
120
+ clampLines: 3
121
+ charGuardrail: 210
122
+ measurementBasis: local_chrome_browser_layout | estimated_width_model
123
+ visibleTextBlock: <literal first 3 rendered lines>
124
+ renderedLines:
125
+ - <line 1 exactly as wrapped>
126
+ - <line 2 exactly as wrapped>
127
+ - <line 3 exactly as wrapped>
128
+ lineCountBeforeClamp: <number>
129
+ blankLinesBeforeClamp: <number>
130
+ corePainProofOrCuriosityVisible: true | false
131
+ corePointVisible: true | false
132
+ seeMoreRisk: pass | warn | fail
133
+ diagnostics:
134
+ charCount: <number>
135
+ charCountIncludingNewlines: <number>
136
+ firstLineChars: <number>
137
+ firstTwoPhysicalLinesChars: <number>
138
+ longestNonblankLineChars: <number>
139
+ blankLineVisualRisk: none | low | medium | high
140
+ pointAfterMobileClamp: true | false
141
+ openLoopType: none | hidden_payoff | contradiction | proof_gap | workflow_reveal | asset_reveal | story_gap
142
+ rewriteIfTruncated: <short fallback>
143
+ ```
144
+
145
+ If a host cannot produce literal wrapped line blocks from
146
+ `calculate_linkedin_hook_preview`, return `blocked` or `needs_revision`; do not
147
+ claim the hook passed preview validation from character counts alone.
148
+
149
+ ## Study Rules
150
+
151
+ For source-post research:
152
+
153
+ - Render the exact visible opening from full text when full text is available.
154
+ - If only a search preview is available, render only the preview text and set
155
+ `basis: manual_user_source` or record `sourceTextBasis: search_preview`.
156
+ - Lower confidence when the search preview is cut off or the body is
157
+ unavailable.
158
+ - Extract hook lessons from the rendered first-screen experience, not from the
159
+ full post in isolation.
160
+
161
+ For generated hooks:
162
+
163
+ - Generate the hook from the selected premise first.
164
+ - Render the hook for mobile and desktop before scoring it.
165
+ - Score the rendered first-screen click reason before scoring cleverness.
166
+ - If the goal is see-more clicks, the hook may intentionally hide the payoff
167
+ after the mobile clamp, but the visible block must create a specific question
168
+ the target reader wants answered.
169
+ - Rewrite any candidate whose real point appears after the mobile clamp unless
170
+ that point is the planned payoff for an intentional open loop.
171
+
172
+ ## Pass, Warn, Fail
173
+
174
+ Use these rendered gates:
175
+
176
+ - `pass`: the mobile rendered preview shows the pain, proof, or curiosity by the
177
+ end of the first 3 rendered lines, and either the core point is
178
+ understandable without opening "see more" or an intentional open loop creates
179
+ a specific click question with an immediate planned payoff.
180
+ - `warn`: the mobile rendered preview creates useful curiosity but the core
181
+ point or click question is slightly softened by wrapping, blank-line rhythm,
182
+ or one missing context word. A compact fallback is required.
183
+ - `fail`: the hook's real point appears after the first 3 mobile rendered lines,
184
+ the visible open loop is vague, the first rendered line is generic setup,
185
+ blank lines consume the preview before the reader sees the point, or desktop
186
+ fit is the only reason it looks good.
187
+
188
+ A draft cannot be `ready` when the selected hook has:
189
+
190
+ - no `renderedPreview`
191
+ - `mobile.seeMoreRisk: fail`
192
+ - `mobile.corePainProofOrCuriosityVisible: false`
193
+ - `mobile.corePointVisible: false` unless `mobile.intentionalOpenLoop: true`,
194
+ `mobile.specificClickQuestionVisible: true`, and
195
+ `mobile.payoffPlannedImmediatelyAfterClamp: true`
196
+ - `pointAfterMobileClamp: true` unless the point after the clamp is the
197
+ intentional payoff for a specific open loop
198
+
199
+ ## Report Format
200
+
201
+ Research reports must show rendered preview blocks for the best examples and
202
+ recommended draft directions:
203
+
204
+ ```text
205
+ Rendered preview:
206
+ mobile:
207
+ <line 1>
208
+ <line 2>
209
+ <line 3>
210
+
211
+ desktop:
212
+ <line 1>
213
+ <line 2>
214
+ <line 3>
215
+
216
+ verdict: pass | warn | fail
217
+ why: <what is visible before the fold>
218
+ ```
219
+
220
+ Do not say "it fits on mobile" without showing what the mobile reader actually
221
+ sees.
@@ -50,19 +50,41 @@ Idea files must preserve:
50
50
  - `updatedAt`
51
51
  - exact raw source between raw-source markers
52
52
  - optional distilled brief that does not add new claims
53
+ - transcript worldview packet when create-post has mined relevant
54
+ transcript/content-memory material for this idea
53
55
 
54
56
  Hook research files must preserve:
55
57
 
56
58
  - source idea ID
59
+ - transcript/content-memory match status and transcript worldview packet
57
60
  - keywords searched
58
61
  - filters used
59
62
  - source post URLs
60
63
  - author/profile URLs
61
64
  - engagement totals
65
+ - author follower counts when available, target follower band, follower-band
66
+ fit, engagement per 1k followers, weighted engagement per 1k followers,
67
+ reach-adjusted score, and normalization confidence notes when reach
68
+ normalization was used
62
69
  - full-text availability
63
70
  - source hook preview measurements, including text basis, char count including
64
71
  newlines, physical/content line counts, longest nonblank line, blank-line
65
72
  visual risk, and mobile/desktop preview budget status
73
+ - audience tension snapshot and selected angle
74
+ - rendered preview records for kept source hooks and adapted hook blocks,
75
+ including literal mobile/desktop preview blocks and whether the first-screen
76
+ promise is visible
77
+ - thought leader voice variants from the configured active influencer list or
78
+ supplied named subset, including worker status, profile URL/handle, recent
79
+ posts sampled, inferred voice model, representative-length role-played post
80
+ variant, source URLs sampled, steal/drop notes, factual risk notes,
81
+ `workerExecutionMode`, expected active influencer count, actual variant count,
82
+ missing variants, weak variants, and background worker IDs or labels when
83
+ available
84
+ - source-message outlines for keeper posts, preserving source paragraph order
85
+ and branching each paragraph, line, or phrase into high-level goal, reader
86
+ effect, reusable move, and adaptation guard without reproducing the full
87
+ outside source post
66
88
  - extracted hook patterns
67
89
  - selected hook basis
68
90
 
@@ -70,6 +92,8 @@ Draft files must preserve:
70
92
 
71
93
  - source idea ID
72
94
  - hook research ID
95
+ - transcript worldview packet used to build the premise, worldview, and hot
96
+ take
73
97
  - versioned draft ID, normally ending in `_v1`, `_v2`, `_v3`, etc.
74
98
  - iteration metadata when there is a prior or baseline draft:
75
99
  - `version`
@@ -81,8 +105,25 @@ Draft files must preserve:
81
105
  - score fields for hook, proof, voice, specificity, skimmability, and publish confidence
82
106
  - `verdict`: `baseline`, `keep`, `revise`, `reject`, `publish_candidate`, or a similarly explicit state
83
107
  - draft body
108
+ - source-message outline for any outside post being adapted, when the draft's
109
+ body shape was learned from a specific source post
110
+ - thought leader voice variant lab by default, including voice models, variants
111
+ considered, selected synthesis ingredients, final Christian/Sellable voice,
112
+ style-simulation risk, active configured influencer list, expected-vs-actual
113
+ variant counts, `workerExecutionMode`, background worker IDs or labels, and
114
+ skipped/opt-out reason when omitted
115
+ - pre-draft narrative outline: hierarchical `I.`, `A.`, `i.` outline covering
116
+ hook debt, thesis, reader, core mechanism, definitions, proof claims,
117
+ working body patterns adapted, narrative beats, mobile scan path, body
118
+ promise, concrete examples, abstractions to remove, and draft risks
84
119
  - validation receipt, including LinkedIn preview pass/warn/fail status and
85
120
  compact fallback when the selected hook carries a warning
121
+ - visible flow trace when the user asked for whole-flow, debug, or step-by-step
122
+ mode, including checkpoint statuses, quality break, downstream effect, and
123
+ whether the trace was shown before saving
124
+ - rendered mobile and desktop preview blocks for the selected hook; drafts
125
+ cannot be ready when this rendered-preview audit is missing or fails mobile
126
+ visibility
86
127
  - status: `draft`, `ready`, `needs_revision`, `published`, or `archived`
87
128
 
88
129
  Multiple drafts for the same idea are expected. Keep the `ideaId` stable and