@sellable/mcp 0.1.263 → 0.1.265

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.
@@ -5,45 +5,49 @@ 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
- `mcp__sellable__render_linkedin_post_preview` or through a stricter
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
10
  authenticated LinkedIn screenshot.
11
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.
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
16
 
17
17
  ## Rendering Basis
18
18
 
19
19
  LinkedIn does not publish exact feed truncation rules, and rendering can vary by
20
20
  surface, app version, device, media attachment, and account state. Use this
21
- deterministic renderer as the MCP review gate for unpublished drafts.
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.
22
26
 
23
27
  Call:
24
28
 
25
29
  ```json
26
- mcp__sellable__render_linkedin_post_preview({
30
+ mcp__sellable__calculate_linkedin_hook_preview({
27
31
  "postText": "<full post text or candidate hook block>",
28
32
  "sourceLabel": "<draft id, hook id, or source label>",
29
- "renderScreenshots": true
33
+ "measurementMode": "browser"
30
34
  })
31
35
  ```
32
36
 
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.
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.
36
41
 
37
42
  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
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
47
51
  - blank lines and intentional separators consume visible preview lines
48
52
  - device width, font scaling, app version, browser, and profile/page context can
49
53
  move the cutoff
@@ -86,13 +90,16 @@ selected hook must include a `renderedPreview` record:
86
90
 
87
91
  ```text
88
92
  renderedPreview:
89
- basis: local_chrome_headless_screenshot | linkedin_css_contract_html | authenticated_linkedin_screenshot | manual_user_source
90
- cssContractVersion: linkedin-preview-rendering/v1
93
+ basis: linkedin_rendering_rule_function | authenticated_linkedin_screenshot | manual_user_source
94
+ cssContractVersion: linkedin-preview-rendering/v2
91
95
  mobile:
92
96
  textWidthPx: 308
93
97
  fontSizePx: 14
94
98
  lineHeightPx: 21
95
- visibleTextBlock: <literal first rendered review-clamp block or tool estimated block when screenshot is the authority>
99
+ clampLines: 3
100
+ charGuardrail: 140
101
+ measurementBasis: local_chrome_browser_layout | estimated_width_model
102
+ visibleTextBlock: <literal first 3 rendered lines>
96
103
  renderedLines:
97
104
  - <line 1 exactly as wrapped>
98
105
  - <line 2 exactly as wrapped>
@@ -106,13 +113,14 @@ renderedPreview:
106
113
  payoffPlannedImmediatelyAfterClamp: true | false
107
114
  seeMoreClickReason: <why a reader would click see more>
108
115
  seeMoreRisk: pass | warn | fail
109
- htmlPath: <local path>
110
- screenshotPath: <local path when Chrome rendered PNG>
111
116
  desktop:
112
117
  textWidthPx: 582
113
118
  fontSizePx: 14
114
119
  lineHeightPx: 21
115
- visibleTextBlock: <literal first rendered review-clamp block>
120
+ clampLines: 3
121
+ charGuardrail: 210
122
+ measurementBasis: local_chrome_browser_layout | estimated_width_model
123
+ visibleTextBlock: <literal first 3 rendered lines>
116
124
  renderedLines:
117
125
  - <line 1 exactly as wrapped>
118
126
  - <line 2 exactly as wrapped>
@@ -122,8 +130,6 @@ renderedPreview:
122
130
  corePainProofOrCuriosityVisible: true | false
123
131
  corePointVisible: true | false
124
132
  seeMoreRisk: pass | warn | fail
125
- htmlPath: <local path>
126
- screenshotPath: <local path when Chrome rendered PNG>
127
133
  diagnostics:
128
134
  charCount: <number>
129
135
  charCountIncludingNewlines: <number>
@@ -136,11 +142,9 @@ renderedPreview:
136
142
  rewriteIfTruncated: <short fallback>
137
143
  ```
138
144
 
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.
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.
144
148
 
145
149
  ## Study Rules
146
150
 
@@ -67,9 +67,14 @@ Hook research files must preserve:
67
67
  - source hook preview measurements, including text basis, char count including
68
68
  newlines, physical/content line counts, longest nonblank line, blank-line
69
69
  visual risk, and mobile/desktop preview budget status
70
+ - audience tension snapshot and selected angle
70
71
  - rendered preview records for kept source hooks and adapted hook blocks,
71
72
  including literal mobile/desktop preview blocks and whether the first-screen
72
73
  promise is visible
74
+ - thought leader inspiration packets when the user supplied creators, including
75
+ worker status, profile URL/handle, recent posts reviewed, weighted winners,
76
+ follower-adjusted signal when available, allowed mechanics to adapt, and
77
+ forbidden borrowing
73
78
  - source-message outlines for keeper posts, preserving source paragraph order
74
79
  and branching each paragraph, line, or phrase into high-level goal, reader
75
80
  effect, reusable move, and adaptation guard without reproducing the full
@@ -94,6 +99,9 @@ Draft files must preserve:
94
99
  - draft body
95
100
  - source-message outline for any outside post being adapted, when the draft's
96
101
  body shape was learned from a specific source post
102
+ - thought leader inspiration lab when used, including the selected inspiration
103
+ adapter, variants considered, Christian/Sellable voice layer, and
104
+ copying/voice-clone risk
97
105
  - pre-draft narrative outline: hierarchical `I.`, `A.`, `i.` outline covering
98
106
  hook debt, thesis, reader, core mechanism, definitions, proof claims,
99
107
  working body patterns adapted, narrative beats, mobile scan path, body
@@ -28,7 +28,8 @@ Every saved draft needs a validation receipt. A draft without this receipt is no
28
28
  - `storyFilesConsulted`
29
29
  - `goldStandardsConsulted`
30
30
  - `voiceRulesApplied`
31
- - `marketBeliefAudit`
31
+ - `audienceTensionAudit`
32
+ - `thoughtLeaderInspirationLab`
32
33
  - `premiseValueAudit`
33
34
  - `mobileScanabilityAudit`
34
35
  - `templateAdaptationAudit`
@@ -110,7 +111,7 @@ Each candidate should include:
110
111
  After the first draft:
111
112
 
112
113
  1. remove unsupported claims
113
- 2. verify the draft is anchored to the selected market belief and controversy
114
+ 2. verify the draft is anchored to the selected audience tension and credible angle
114
115
  3. verify the real story/scene, tension, and reader value are visible early
115
116
  4. verify the body repays the selected hook's curiosity debt
116
117
  5. verify the final post follows the selected positioning sequence or explains
@@ -181,7 +182,7 @@ Record:
181
182
  artifact is `preDraftNarrativeOutline`
182
183
  - `premiseQualityGates`: pass/fail for `specific_scene_or_pattern`,
183
184
  `clear_reader`, `visible_tension`, `reader_value`, `credible_speaker`,
184
- `proof_safety`, `market_heat`, and `pre_draft_narrative_outline`
185
+ `proof_safety`, `audience_tension`, and `pre_draft_narrative_outline`
185
186
  - `bodyOutline`: how the body delivers the premise before prose
186
187
  - `viralPostOutline`: the selected narrative structure, including beat jobs
187
188
  - `hookToBodyPromiseMap`: how the body repays the hook's open loop
@@ -296,27 +297,53 @@ Save as `needs_revision` when the draft copies outside wording, borrows outside
296
297
  proof, keeps a source template's status without equivalent user authority, or
297
298
  uses a hook whose promised body payoff is not delivered.
298
299
 
299
- ## Market Belief Audit
300
+ ## Audience Tension Audit
300
301
 
301
302
  Before a draft can be `ready`, validate that it is not merely an internally
302
- coherent idea. It must be anchored to the saved research's market belief map.
303
+ coherent idea. It must be anchored to the saved research's audience tension
304
+ snapshot.
303
305
 
304
306
  Record:
305
307
 
306
308
  - `resonatingIdea`: the current-space idea this draft enters
307
- - `implicitBelief`: the belief the audience likely already holds
309
+ - `visibleAudienceTension`: the contradiction, tradeoff, cost, or unfinished
310
+ question readers are reacting to
308
311
  - `audienceWant`: what the audience wants permission, leverage, proof, or a new
309
312
  category for
310
- - `audienceResentmentOrFear`: what frustration or risk gives the post tension
311
- - `selectedControversy`: the claim the post is testing
313
+ - `audienceObjectionOrFear`: what skepticism, frustration, or risk gives the post tension
314
+ - `selectedAngle`: the claim the post is testing
312
315
  - `credibleWhyUs`: why the user can credibly say this from raw idea, memory,
313
316
  story, proof, or product mechanism
314
317
  - `engagementReason`: why someone would react, comment, repost, or argue
315
318
  - `unsupportedHypeRemoved`: unsupported claims removed during finalizer
316
319
 
317
- If `selectedControversy` is missing, if the audience belief is only a generic
318
- label like "founders want growth," or if `credibleWhyUs` depends on borrowed
319
- proof from another creator, save as `needs_revision`.
320
+ If `selectedAngle` is missing, if the audience tension is only a generic label
321
+ like "founders want growth," or if `credibleWhyUs` depends on borrowed proof
322
+ from another creator, save as `needs_revision`.
323
+
324
+ ## Thought Leader Inspiration Audit
325
+
326
+ When the user supplied thought leaders or creators, validate that inspiration
327
+ was used as structural adaptation, not persona cloning.
328
+
329
+ Record:
330
+
331
+ - `thoughtLeaderList`: names and profile URLs or handles
332
+ - `workerPackets`: one packet per person, or `not_available` with reason
333
+ - `weightedWinners`: best posts used, with follower-adjusted signal when
334
+ available
335
+ - `normalizationConfidence`: high | medium | low
336
+ - `inspirationAdapters`: hook/body mechanics selected for adaptation
337
+ - `voiceLayer`: must be `Christian/Sellable`
338
+ - `forbiddenBorrowingAvoided`: source wording, proof, jokes, personal stories,
339
+ status, and persona markers avoided
340
+ - `variantsConsidered`: adapted variants generated from the selected premise
341
+ - `selectedVariant`: winning adapter and why
342
+ - `copyingOrVoiceCloneRisk`: pass | needs_revision | blocked
343
+
344
+ Save as `needs_revision` when a draft imitates a living person's voice, borrows
345
+ their proof/status, copies outside wording, or lets a creator with a giant
346
+ audience win without any follower-adjusted or confidence-adjusted signal.
320
347
 
321
348
  ## LinkedIn Preview Audit
322
349
 
@@ -3,7 +3,7 @@
3
3
  A strong post is not an idea with a better hook. A strong post is a valuable
4
4
  premise wrapped in a sharp opening.
5
5
 
6
- Use this stage after market/hook research and before hook candidates. V2 premise
6
+ Use this stage after audience/hook research and before hook candidates. V2 premise
7
7
  development also consumes the source post templates from hook research:
8
8
  post positioning breakdowns, viral-post outlines, hook-to-body promise maps, and
9
9
  body expression inputs.
@@ -109,7 +109,7 @@ tension:
109
109
  reader value:
110
110
  <what the reader learns, sees differently, or can do after reading>
111
111
 
112
- why now / market heat:
112
+ why now / audience tension:
113
113
  <what current research says is resonating>
114
114
 
115
115
  credible why-us:
@@ -366,7 +366,7 @@ A premise can move to hook generation only when it passes all of these:
366
366
  - `reader_value`: pass
367
367
  - `credible_speaker`: pass
368
368
  - `proof_safety`: pass
369
- - `market_heat`: pass or explained
369
+ - `audience_tension`: pass or explained
370
370
  - `template_fit`: pass or explicitly no-template
371
371
  - `hook_to_body_repayment`: pass
372
372
  - `pre_draft_narrative_outline`: pass